2012-07-24 2 views
8

정규식을 더 잘 사용하려고합니다. (?> expression) 의미를 이해하려고 힘든 시간을 보내고 있습니다. backtacking이 아닌 subexpressoins에 대한 자세한 정보는 어디에서 찾을 수 있습니까? THIS 링크의 설명은 다음과 같습니다 :역 추적을 수행하지 않는 부분 표현식은 어떻게 작동합니까? (?> exp) "

욕심이 많은 하위 표현식은 역 추적이 아닌 부분 표현식이라고도합니다. 이것은 한 번만 일치 한 다음 역 추적에 참여하지 않습니다.

이 다른 링크 : http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspx도 아닌 되돌아 오는 표현식 의 정의를 가지고 있지만 난 여전히 힘든 시간이 플러스 내가 (?>exp)

답변

9

를 사용하는 예 생각할 수 없다을 무엇을 의미하는지 이해하는 데 항상 그렇듯이 regular-expressions.info은 시작하기에 좋은 장소입니다.

한 번 일치 한 항목이 일치 항목에 머물러 있는지 확인하려는 경우 원자 그룹을 사용하십시오. 매치가있을 때,

(?:[A-Za-z0-9_.&,-]+\s*)+: 

:

예를 들어, 나 콜론 다음 공백으로 구분 하였다되지 않을 수있다 "단어"의 수와 일치하는 사용자는 정규식을 시도 모든 것이 괜찮았다. 그러나 그렇지 않은 경우 정규식 엔진이 다음 콜론을 일치시킬 수있는 일치하는 단어 조합을 찾기 위해 노력할 것이므로 치명적인 역 추적으로 인해 자신의 PC는 100 % CPU로드로 응답하지 않게됩니다. 물론 불가능했습니다. 원자 그룹을 사용하여

,이 방지 될 수 있었다 :

(?>[A-Za-z0-9_.&,-]+\s*)+: 

이 지금 어떤 일치 된하는 것은 일치하지 상태로 유지 - 더 되돌아을하기 때문에 빠른 시간 실패.

8

정규식 튜토리얼은 여기에 페이지가 있습니다 : http://www.regular-expressions.info/atomic.html

는 기본적으로 무엇을하는 일은 폐기가 정보를 되돌아 의미입니다 a(?>bc|b)c 일치 abcc하지만 abc.

두 번째 문자열과 일치하지 않는 이유는 bc과 일치하는 것을 발견하고 bc|b에 대한 역 추적 정보를 삭제하기 때문입니다. 본질적으로 |b 부분을 잊었습니다. 따라서 bc 뒤에 c이 없으므로 일치하지 않습니다.

원자 그룹을 사용할 때 가장 유용한 방법은 느린 regexes를 최적화하는 것입니다. 앞서 언급 한 페이지에서 더 많은 정보를 찾을 수 있습니다.

1

위로 올라가서 possessive quantifiers[a-z]*+ 위로 읽는 엔진은 역 추적 엔진이 일치하는 모든 이전 단계와 일치하지 않는 이전 단계 만 기억하게합니다.

많은 수락 가능한 단계가있을 가능성이 있으며 각 단계가 가능한 역행 회귀 분석을 위해 저장되는 경우 메모리를 소모합니다.

소유량 한정 기호는 원자 그룹의 약자입니다.

관련 문제