2010-04-29 6 views
10

둘러보기에서 역 참조를 사용할 수 있습니까?lookbehind의 역 참조

내 뒤에 문자가 두 번 반복되는 경우 split으로 보내고 싶다고합시다. 사용

String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK! 
    String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS! 

    System.out.println(java.util.Arrays.toString(
     "Bazooka killed the poor aardvark (yummy!)" 
     .split(REGEX2) 
    )); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]" 

REGEX2 (역 참조는 lookbehind 안에 중첩 된 내다에 임) 작동하지만 REGEX1 런타임에서이 오류를 제공합니다

Look-behind group does not have an obvious maximum length near index 8 
(?<=(.)\1) 
     ^

메이크업 감각이 종류, I 일반적으로 역 참조는 길이에 관계없이 문자열을 포착 할 수 있기 때문에 (정규식 컴파일러가 조금 더 똑똑하다면 \1(.)이고 따라서 길이가 한정되어 있다고 판단 할 수 있습니다).

역서에서 역 참조를 사용하는 방법이 있습니까?

그리고 그렇지 않은 경우,이 중첩 된 미리보기 헤드를 사용하여 항상 문제를 해결할 수 있습니까? 다른 일반적으로 사용되는 기술이 있습니까?

+1

당신의 독창적 인 해결 방법은 재미 있고 +1입니다. Java를 사용하지 않으므로 직접 시도 할 수 없습니다. 역 참조 그룹이'(? <= \\ 1) (.)'과 같이 둘러보기를 벗어나는 경우 어떻게됩니까? –

+0

@Tim : 결과적으로 'PatternSyntaxException'과 같은 결과를 낳습니다. 그건 그렇고, 만약 누군가가이 문제의 변종으로 놀고 싶어, 나는 단지 코딩에 하나를 저작 : http://codingbat.com/prob/p266235 – polygenelubricants

+0

@ polygenelubricants 나는이 정규식을 upvote 수 좋겠어 : (? <= (? = (.) \\ 1) ..) 적어도 10 번. 매우 우아한! – Eugene

답변

5

Java lookbehinds에서 일반적으로 역 참조를 사용할 수 없다는 의심의 여지가 있습니다. 제안한 해결 방법은 lookbehind의 유한 길이를 명시 적으로 만들어 주며 매우 영리하게 보입니다.

나는이 정규식으로 파이썬이 무엇을하는지 알아내는 데 흥미를 느꼈다. 파이썬은 자바처럼 유한 길이가 아닌 고정 길이의 lookbehind 만 지원하지만이 정규식은 고정 길이입니다. 파이썬의 re.split() 결코 빈 경기에 분할하지 않기 때문에 내가 직접 re.split()를 사용할 수없는,하지만 난 re.sub()에서 버그를 발견 한 것 같아요 :

>>> r=re.compile("(?<=(.)\\1)") 
>>> a=re.sub(r,"|", "Bazooka killed the poor aardvark (yummy!)") 
>>> a 
'Bazo|oka kil|led the po|or a|ardvark (yum|my!)' 

lookbehind는 사이에 두 개의 중복 문자와 일치!

+0

더 많은 정규식을 얻으려면 http://stackoverflow.com/questions/2628534/codingbat-plusout-using-regex를 확인하십시오. – polygenelubricants

+0

그것은're.split()'이 빈 일치에 나눠지지 않는 것은 어리석은 짓입니다. 왜 그들은 그것을 그렇게 할 것입니까? 실제 비어 있지 않은 구분자 대신 어설 션을 기반으로 간단하게 분할하려는 경우가 많다고 생각합니다. – polygenelubricants

+0

파이썬 bugtracker에서 같은 질문을했습니다. 아마도 의도하지 않았지만 호환성 문제가 발생하지 않도록 혼자 남겨져 있습니다. 주요 정규식 엔진 점검이 진행 중입니다.하지만 새로운 정규식 모듈이 표준 라이브러리에 병합 될 때까지는 다소 시간이 걸릴 수 있습니다. –