정규 표현식이 정규 표현식이 아닌 경우는 언제입니까?


9

나는 공식 언어 대학 과정을 공부하고 있기 때문에 정규 표현식을 사용하여 소수를 찾는 방법을 설명하는 매혹적인 게시물 ( One Two )을 우연히 발견했습니다 . 내가 말한 것처럼, 정규 표현식 이 아닌 정규 표현식 . 정규 표현식은 유한 상태 오토마타 (Finite State Automata)에 의해 계산 된 문자열과 일치 할 수 있고 FSA에 의해 소수를 찾을 수 없기 때문에 블로그 게시물에 표시된 정규 표현식은 문자열과 일치하도록 역 추적하기 때문에 완전히 정규 표현식 이 아닙니다 .

정규 표현식을 실제로 사용한 적이 없으므로 이제 내 질문 :

"true"정규식에서 정규식을 즉시 인식하는 방법은 무엇입니까?

정의 : 정규식에서는 공식 언어로 정의 된 개념을 참조합니다. 정규 표현식으로, 나는 현대 프로그래밍 언어가 지원하는 개념을 의미합니다. 정규 표현식 구문에는 종종 역 참조와 같은 추가 기능이 포함됩니다. 프로그래밍 언어에서 볼 수있는 정규 표현식은 공식 언어 스타일 정규 표현식보다 훨씬 강력 합니다.


5
정규 표현식은 정규 표현식의 약어입니다. 소수 계산은 정규식이 아닌 Perl 핵을 기반으로합니다.

1
오히려 간단하다. 정규 언어는 연결, 반복 및 교체를 사용합니다. 엔진이 이것과 동등하지 않은 것을 지원할 때마다 비정규 적입니다.
Kilian Foth

1
관련 질문 : 1 , 2 , 3 .
Raphael

@Yannis 펜스를 넘어 CS로 넘어 가면 더 이상 사실이 아닙니다. 프로그래밍 언어에서 볼 수있는 정규 표현식은 (공식 언어 스타일) 정규 표현식보다 훨씬 강력하며 "regexp"라는 짧은 형식은 후자가 아니라 전자에 사용되는 규칙에 따라 사용됩니다. 종류.
Raphael

@KilianFoth 그래도 유용한 설명은 아닙니다. 예를 들어, 정규 표현식에 검정력을 높이 지 않고 부정 (또는 유한 부울 연결 세트)을 추가 할 수 있습니다.
David Richerby

답변:


13

tl; dr 역 참조.

이 빨리으로 \1는 정규 표현식 아닌 정규 표현식에서 (유니 코드를 탈출하는 데 사용되지 않습니다 또는 수).

역 참조를 사용하면 n> 1에 대해 (a+)b\1n 번 일치 한 a다음 b 뒤에 n 번 일치 하는 항목 을 일치 시킬 수 있습니다 a. 이것은 정규 언어가 아닙니다 (비정규 언어의 포스터 자식입니다).

필요는 거의 충분 그 역 참조 참조 그것이 포함 임의의 긴 문자열과 일치하거나 정규 표현식이 포함 된 그룹 *또는 +. (A)B\1A가 유한 언어 인 형식의 정규 표현식에 대한 유일한 예외 (내가 찾은)는 (단어를 수용하는 모든 단어의 열거로 대체 될 수 있음). word1+Bword1|word2+Bword2A가 유한하기 때문에 등으로 변환 할 수 있습니다 .

둘러보기 그룹은 정규 표현식의 규칙 성을 제거하지 않습니다. A(?=B)C정규 표현식에의 단면도이다 AB.*AC2 개 일반 언어의 단면은 일반입니다. 부정적 예측은 B.*(보통 정규 언어 의 보완)을 보완한다는 점을 제외하고 비슷 합니다. Lookbehind뿐만 아니라 정확히 동일 A(?<=B)C의 단면도이다 AC.*BC.


이것이 필요하고 충분합니까? 나는 (a)\1backref를 사용하는 동안 마치 평범한 것과 같고 aa사소한 것처럼 보입니다 . 또한 미리보기 어설 션이 비정규 언어를 인식하는 데 사용할 수 있는지 궁금합니다.
MSalters

1
@MSalters : 정말 기술적으로 배우고 싶다면 (a)\1정규 표현이 아니라 정규 언어를 인식합니다.
Jörg W Mittag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.