2012-01-24 1 views
0

내가 문제가이 정규 표현식을 쓰는 많은 데 lookbehind Java 환경 (Eclipse Helios R2를 사용하는 JRE 1.6.0.25)은 Pattern.compile() 메소드가 "구문 오류 U_REGEX_LOOK_BEHIND_LIMIT"예외를 throw하기 때문에 작동하지 않습니다. 패턴 (?<=\s+|^\s*|\(\s*|\.) 뒤의 모습이 정의 된 제한이 있어야하기 때문이다무제한 한정사는

(내가 아는 한 무제한는 수량은 *+으로까지 여기에 허용되지 않습니다).

은 또한 운없이 이런 식으로 반복의 범위를 지정하려고 :

그래서
(?<=\s{0,1000}|^\s{0,1000}|\(\s{0,1000}|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.) 

, 어떻게 내가 심지어 자바 환경에서 작동 동일한 정규식을 쓸 수 있습니까? 이런 종류의 일반적인 상황에 대한 해결 방법이 없다고는 믿을 수 없습니다 ....

답변

2

Lookbehind는 반드시 뒤떨어져 있습니다. 예를 들어, 이전 문자가 공백 인 경우 (?<=\s+)이 만족됩니다. 그것은 더 이상 보이지 않아도됩니다.

당신의 lookbehind에 대해서도 마찬가지입니다. 문자열의 시작 부분이 아니고 이전 문자가 공백, 열린 괄호 또는 마침표가 아닌 경우 더 먼 곳을 바라 볼 시점이 없습니다. 다음과 같습니다.

(?<=^|[\s(.]) 

동일한 방식으로 미리보기 헤드를 응축 할 수 있습니다.

(?=[\s).]|$) 

그래서 마지막 정규식은 다음과 같습니다 :

(?<=^|[\s(.])(?:item|item1|item2)(?=[\s).]|$) 
는 문자열의 끝이 아니다, 그리고 다음 문자가 공백이 아닌 경우, 근접 괄호 또는 기간, 어떤 점은 더 찾고 없다
+0

도움 주셔서 대단히 감사합니다! 나는 당신의 정규식을 시도하고 그것은 좋은 것! 나는 접근 방식을 바꾸고 lookge regex code를 작성하는 동안 더 많은 attantion을 지불해야한다 ... 당신의 도움은 매우 유용하다! – GiveEmTheBoot