정규식 엔진 구현의 실질적인 문제에 대한 권위있는 참고 문헌은 Russ Cox의 일련의 블로그 게시물 입니다. 여기에 설명 된대로 역 참조는 언어를 비정규로 만들기 때문에 역 추적을 사용하여 구현됩니다 .
정규 표현식 패턴 일치 엔진의 많은 기능과 마찬가지로 LookAhead와 LookBehind는 문자열이 언어의 멤버인지 아닌지를 결정하는 패러다임에는 적합하지 않습니다. 정규 표현식 대신 우리는 일반적으로 더 큰 문자열 내에서 하위 문자열을 검색합니다. "일치"는 언어의 멤버 인 하위 문자열이며 반환 값은 더 큰 문자열 내에서 하위 문자열의 시작 및 끝 지점입니다.
lookaheads 및 lookbehinds의 요점은 비정규 언어를 일치시키는 기능을 도입하는 것이 아니라 엔진이 일치하는 하위 문자열의 시작 및 종료점을보고하는 위치를 조정하는 것입니다.
http://www.regular-expressions.info/lookaround.html 의 설명에 의존하고 있습니다. 이 기능을 지원하는 정규식 엔진 (Perl, TCL, Python, Ruby 등)은 모두 역 추적을 기반으로하는 것 같습니다 (즉, 일반 언어보다 훨씬 더 큰 언어 집합을 지원합니다). 그들은이 기능을 작업을 수행하기 위해 실제 유한 한 오토마타를 구성하려고하기보다는 비교적 "간단한"역 추적 확장으로 구현하는 것 같습니다.
긍정적 인 전망
긍정적 인 예측 의 구문 은 (?=
regex)
입니다. 따라서 예를 들어 q(?=u)
뒤에이 q
있는 경우에만 일치하지만와 일치 u
하지 않습니다 u
. 나는 그들이 역 추적의 변형으로 이것을 구현한다고 상상한다. 긍정적 인 예측 전에 식에 대한 FSM을 작성하십시오. 일치하면 종료 위치를 기억하고 긍정적 인 예측 내부의 표현식을 나타내는 새 FSM을 시작하십시오. 일치하는 경우 "일치"가 있지만 양의 예측 예측 일치가 시작된 위치 바로 직전에 "종료"됩니다.
역 추적 없이는이 작업의 유일한 부분은 lookahead가 시작되는 입력 지점을 기억하고 일치하는 작업을 마친 후 입력 테이프를이 위치로 다시 이동해야한다는 것입니다.
부정적 예측
부정적 예측 의 구문 은 (?!
regex)
입니다. 따라서 예를 들어 q(?!u)
뒤에이 q
없는 경우에만 일치 합니다 u
. 이것은 q
뒤에 다른 문자가 오거나 q
문자열의 맨 끝에 있을 수 있습니다 . 이것은 lookahead 표현식에 대한 NFA를 생성 한 다음 NFA가 후속 문자열과 일치하지 않는 경우에만 성공함으로써 구현된다고 생각합니다.
역 추적에 의존하지 않고 수행하려면 lookahead 표현식의 NFA를 무효화하고 긍정적 인 lookahead를 처리하는 것과 동일한 방식으로 처리하십시오.
긍정적 인 전망
긍정적 인 lookbehind 의 구문 은 (?<=
regex)
입니다. 따라서, 예를 들어, (?=q)u
일치 u
하지만이 앞에 경우에만, q
하지만 일치하지 않습니다 q
. 분명히 이것은 정규식 엔진이 실제로 백업하는 완벽한 해킹으로 구현 일치하는 문자와 시도를 정규식 사람들에 대해 문자. 이것은 정규 표현식 이 길이가 문자열과 만 일치해야 함을 의미합니다 .n n엔엔엔
lookbehind 연산자 앞에 오는 정규식의 어떤 부분과 " regex로 끝나는 문자열"을 교차하여 역 추적없이이를 구현할 수 있습니다 . lookbehind 정규 표현식 은 현재 입력의 시작 부분보다 더 되돌아 볼 필요가 있기 때문에 까다로울 것입니다.
부정적인 전망
제외 lookbehind 의 구문 은 (?<!
regex)
입니다. 따라서, 예를 들어, 앞에 오는 것이 아닌 경우에만 (?<!q)u
일치 u
합니다 q
. 그것은 일치합니다 그래서 u
에서 umbrella
과 u
에서 doubt
가 아니라 u
에서 quick
. 다시 말하지만, 정규 표현식 의 길이를 계산하고 많은 문자를 백업하고 정규 표현식 과의 일치를 테스트 하지만 lookbehind가 일치하면 전체 일치가 실패하는 것으로 보입니다 .
정규식을 부정 하고 긍정적 인 전망을 위해하는 것과 똑같이함으로써 역 추적없이 이것을 구현할 수있을 것입니다.