2012-08-28 3 views
0

이 정규 표현식이 내 응용 프로그램을 멈추게하는 이유는 누구나 알 수 있습니까?이 정규 표현식으로 인해 정규 표현식 엔진이 정지하게되는 이유는 무엇입니까?

/^(?:((?:.+?)(?: of the)?)+) of the (?:(.+?)) (?:"(.+?)")$/

이 같은 문자열을 일치하도록 사용하려고하면 그것은 응답 :

'description of the post "This is a Post"'

를하지만이 같은 짧은 문자열과 일치하는 꽤 빨리 내가 ​​그것을 사용할 때 발생하는 것으로 보인다 : 'age of the person "Bob"'

왜 이런 일이 발생했는지 또는 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까?

+0

아니요,하지만 시스템에 대한 일부 정보 (최소한 언어?)가 도움이 될 수 있습니다. – djechlin

+0

Ruby 1.9.3을 사용하고 있지만이 문제는 모든 정규식 엔진에서 발생하는 것으로 보입니다. – Ajedi32

답변

2

를 역 추적의 많은 수의 문자열을 구문 분석 할 수 없습니다 당신은 당신의 정규 표현식은 반복을 중첩 한 모든 시간을 리팩토링을 시도해야

((?:.+?)(?: of the)?)+ 

: 가능성이 범인입니다. 이 경우 전체 부분을 .+으로 단순화하고 정규 표현식을 동일한 방식으로 수행 할 수 있다고 생각합니다.

+0

그래, 그렇게 생각 했어. 그리고 당신 말이 맞아요, 정규 표현식의 그 부분이 문제입니다. 이 인스턴스를'(. +)'로 줄이는 것이 좋지 않을 것이라고 생각합니다. 동일한 문자열을 검사하는 많은 정규 표현식이있는 컨텍스트에서 사용하기 때문에이 섹션을'. 나는 모호함을 피하고자한다. – Ajedi32

+0

중첩 된 반복을 피할 수있는 한 괜찮습니다. 그러나 정규 표현식에 복잡성을 추가하는 대신 모호성을 피하기 위해 주석을 사용하는 것이 좋습니다. –

+0

정규 표현식이 사람에게 모호하지 않은 것은 아닙니다. 내가 염려하는 것은 응용 프로그램의 예상대로 서식이 지정되지 않은 정규 표현식과 관련이 있습니다. 그게 모호한 의미입니다. – Ajedi32

1

큰 문자열을 구문 분석하는 데 많은 시간이 걸리는 너무 많은 역 추적/그룹화가있을 수 있습니다. 당신이 데모에서 볼 수 있듯이

: http://regex101.com/r/xC3dF0, 시스템 때문에이 정규 표현식, 정규식의 다음 부분에 catastrophic backtracking의 결과입니다

+0

아, 지금은보기 좋은 웹 사이트입니다. – Ajedi32