대부분의 REGEX 구현은 어디에서 복잡성 규모에 해당합니까?


19

perl 또는 .NET과 같은 대부분의 최신 정규식 구현은 lookahead 및 lookbehind와 같은 기능을 가진 REGEX의 고전적인 컴퓨터 과학 정의를 뛰어 넘습니다. 이러한 기능을 통해 푸시 다운이 아닌 유한 오토 마톤으로 설명 할 수없는 문장을 구문 분석 할 수 있습니까? 튜링 완료에 얼마나 근접 할 수 있습니까?


2
밀접하게 관련된 질문 : "역 참조가있는 정규 표현식"과 "임의의 프로그램 코드를 포함 할 수있는 정규 표현식"사이에 흥미로운 점이 있습니까? 예를 들어, 역 참조 가있는 정규 표현식 과 lookahead / lookbehind 가 역 참조가있는 정규 표현식보다 더 표현력이 뛰어나지 않습니까? Perl의 "특수 역 추적 제어 동사"는 어떻습니까?
Jukka Suomela

관련 (및 아마도 잘못된) : stackoverflow.com/questions/2974210/…
Aryabhata

답변:


18

나는 실제 문제가 무한한 의미의 문제라고 생각하지 않습니다. 이것은 파싱의 다른 상황보다 나쁘지 않습니다.

문제는 역 참조의 특성화에 있습니다. 역 참조는 매우 강력하고 제한적입니다. 문맥이없는 언어를 허용하지 않고 문맥이없는 언어를 설명 할 수 있습니다. 예를 들어, 정규식 (a*)b\1b\1 형식 문자열과 일치 하며, 펌핑 보조를 사용하여 이것이 문맥이없는 언어가 아님을 표시 할 수 있습니다. 그러나 역 참조가있는 정규식은 균형이없는 괄호 언어 인 프로토 타입 컨텍스트가없는 언어와 일치하기에 충분하지 않은 것 같습니다.anbanban

정규식에 대한 언어로 된 문자열을 말하는 의미 론적 의미를 부여하는 것은 쉽지만, 우수한 오토마타 이론적 특성을 부여하는 것은 훨씬 더 어려워 보입니다. 레지스터의 입력 문자열을 복사 할 수 있고 현재 문자열을 테스트하는 데 사용할 수 있지만 레지스터를 수정할 수있는 레지스터 머신과 같은 것입니다.

유한 모델 이론을 수행하는 사람들은 많은 펑키 머신 모델을 가지고 있으며 이것이 자신의 모델에 해당하는지 아는 것은 흥미로울 것입니다.


9

이 질문에 대답하는 문제는 실제 구현에서 "언 바운드"라는 개념을 포착하는 것입니다. 예를 들어, 정규 표현식 /(.*)\1/은 언어 없는 상황 무료입니다. 실제로 사용 된 스택에 제한이있을 수 있습니다 (예를 들어, w 는 일부 K 보다 길 수 없습니다 ). 이는 언어를 효과적으로 L K = { w w | w Σ , w K }L={ww|wΣ}wKLK={ww|wΣ,w∣≤K}고정 의 정규식입니다.K

그러나 원칙적으로 지정된 관련 정규 표현식은 일반 언어보다 강력합니다. 이 관련 질문 은 (예를 들어 멋진 예를 통해) 훨씬 자세하게 설명합니다.


{ww | w ∈ Σ ∗, ∣w∣≤K}가 CSL 또는 TM 인식 가능하지 않습니까?
dhruvbird

arggh. ww ^ R을 수행해야합니다. 해결됩니다. 감사합니다
Suresh Venkat

사실, 나는 이것에 대해 질문했다. ww는 CSL입니까 아니면 튜링을 인식합니까? 나는 (아직도) 그것을위한 LBA를 생각
해낼 수 없었다

1
{:Σ}

5

Suresh Venkat과 연결되어있는 이 다른 질문 에서 얻은 한 가지 흥미로운 결과 는 "실용적인"정규 표현식이 NP- 완료되므로 SAT와 동등한 수준이어야한다는 것입니다.

비전문가이기 때문에 직관적으로 "역 참조가있는 정규식이 균형 괄호 언어와 일치하기에 충분하지 않은 것 같습니다"라는 데 동의하지만 이상한 일이 있습니다. NP- 완전성은 NP 문제가 다항식으로 정규 표현식으로 축소 될 수 있음을 의미하므로 아마도 "균형 괄호"언어에서 정규 표현식으로 인식 할 수있는 언어로 다항식 감소가있을 수 있습니다. 그러나 다시 말하지만 CFL을 구문 분석하는 터무니없는 정규 표현식이있을 수 있습니다.

아마도 교훈은 복잡성 클래스와 언어 클래스는 일반적으로 비교할 수 없다는 것입니다. 또한 "복잡성 척도"가 아닌 Chomsky 계층 구조를 참조하여 질문을 표현하는 것이 좋습니다 (공평하더라도, 나는 그것에 혼동되지 않았습니다).

찰스 스튜어트의 글을 참고하세요 :

Aho, 1990, "문자열에서 패턴을 찾기위한 알고리즘"은 역 추적이있는 일반 언어의 멤버쉽 문제가 NP 완료임을 보여줍니다.

289 페이지의 Google 도서 에서 부분 미리보기 (적어도 진술 문)를 찾을 수 있으며 논문에 대한 참고 문헌은 여기 에서 찾을 수 있습니다 . 이 백서에서 rewbr은 정규식 포함 역 참조를 나타냅니다.


3

가장 일반적인 "정규 표현식"구현 인 PCRE는 역 참조를 넘어 재귀 패턴을 구현합니다. 그들의 복잡성에 대한 질문 은 Stackoverflow에서 방금 요청되었습니다 . Perl guru brian d foy의 실질적인 답변에 따르면 PCRE는 문맥없는 문법만큼 강력합니다. 그러나이 구문은 Backus-Naur Form에 비해 끔찍합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.