2011-08-30 7 views
3

정규식에 대해 긴 단어를 컴파일 너무 복잡한 오류를 던지고 복잡한 "Mozilla Firefox를 제외하고. 그것은 IE와 크롬에서 잘 작동합니다.파이어 폭스 내가 다음과 같이 정규식을

+1

"모질라"는 파이어 폭스 또는 정말로 고대 모질라 슈트를 의미합니까? –

+0

나는 모질라 파이어 폭스를 의미한다. – vaibhav

답변

0

정규 표현식이 여러 가지 방법으로 일치 할 수있는 것처럼 보입니다.

\w+\w으로 변경하면 작동합니다. 그 다음에 *이 붙어 있으므로 왜 여기에 +을 넣으시겠습니까?

/.*(?:\w|\S)*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title\:|ingress\:|\?|\*|\^|sourceid\:|author\\:|url\:|country\:)\s+.*/i 
6

정규식이 catastrophic backtracking으로 실행됩니다. 같은 것을 매치 할 수있는 부분이 교대로 있습니다 (예를 들어, \w에 매치되는 모든 문자는 \S 및 그 이전의 .*에 매치 될 수 있습니다). 그래서 정규 표현 엔진은 오류를 선언하기 전에 순열을 시도해야합니다. 예를 들어, RegexBuddy는 1 백만 단계의 정규식 엔진 이후에 일치 시도를 중단하고 Firefox는 분명히 똑같은 (현명한) 일을합니다.

정확히 무엇을하려고합니까? 정규식을 변경

/.*\s+(or|and|not|xnot|near|near\d+|onear|onear\d+|title:|ingress:|\?|\*|\^|sourceid:|author:|url:|country:)\s+.*/i 

이 많은 (지금은 실패를 선언 할 수 정규식 엔진까지 단지 408 단계의) 경기를 가속화

합니다.

+0

+1하지만 양쪽 끝에서'. * '를 제거 할 것입니다. 실제로, 나는 그것보다 더 많은 것을 할 것이지만'. * '은 절대적으로 거기에 속하지 않습니다. –

+0

@Alan Moore, 여기에 할 일이 더 많다는 것과 나는 대개'. * '를 제거하겠다고 동의하지만, 그 중 하나를 포함하는 모든 줄을 포착하려고 할 수도 있습니다. 누가 알아? –