정규 표현식은 그렇지 않습니다


36

컴퓨터 과학에 대한 경험이있는 사람에게도 정규 표현이 무엇인지 물어 보면 유한 상태 오토 마톤에 도달해야한다는 제약을 넘어 설 가능성이 높습니다.

예를 들어“정규 표현식”

/^1?$|^(11+?)\1+$/

유명한 Perl 성격 자인 Abigail (및 2002 년 이후 Perl의 테스트 스위트의 일부 )은 복합 단항 수만 허용하지만 Peter Linz의 제 3 판 공식 언어 및 오토마타 에서는 4.5 (b) 를 사용 하는 기계를 설명 합니다. 펌핑 보조 정리는 것을 증명하기 위해

L={an:n is not a prime number}

일반 언어가 아닙니다.

구별이 중요한 맥락에서, 우리는 무엇을 더 강력하게 표현해야합니까?

답변:


46

Larry Wall은 Kleene이 제안한 형식주의에 "정규 표현식"을 사용하고 널리 사용되는 확장에 대한 표현에는 "정규 표현식"을 사용하도록 제안했습니다. 상당히 광범위하게 준수되는 컨벤션입니다. 공식 언어 의미에서 정규 표현식에 대해 이야기하고 있음을 분명히하려면 일반적으로 일반 언어로 대화하는 것은 어렵지 않습니다.

정규 표현식의 힘은 역 추적에서 비롯되며 역 추적을 사용하는 일반 언어에 대한 오토마타 작업이 수행되었습니다. 특히 Becchi & Crowley, 2008, 유한 오토마타를 확장하여 Perl 호환 정규 표현식을 효율적으로 일치시키기를 참조하십시오 .


5
"Perl regex"( "POSIX regex"등)와 "regular language"와 같은 것은 오해의 가능성을 예방할 수있을 정도로 명확해야한다는 데 동의합니다.
Jukka Suomela

펄 정규 표현식은 역 추적보다 훨씬 더 많은 기능을 가지고 있습니다.
reinierpost

@reinierpost 사실이지만 역 추적은 공식 언어 관점에서 가장 중요하다고 생각합니다. Perl 정규 표현식에는 임의의 Perl 코드 실행과 같은 기능이 있지만 정규 표현식은 PCRE를 포함하는 것으로 느슨하게 해석되어야한다고 생각합니다. PCRE에는 재귀 패턴과 같은 이상한 요소가 포함되어 있지만 어두운 언어이므로 일반 언어 영역을 훨씬 벗어나게됩니다. 그래도 이것들을 다루기 위해 대답을 업데이트 할 수있었습니다.
Charles Stewart

18

이 표현들은 Aho (Theorytical Computer Science, Vol. A, Chp. 5)와 Yue Salomaa, Campeanu ( "실제 정규 표현식의 공식 연구", 국제 컴퓨터 과학 재단 저널, 14 : 1007)에 의해 조사되었습니다. –1018, 2003) 및 후속 논문들.

Aho는보다 강력한 표현을 "rewbr"(역 참조가있는 정규식)이라고합니다. "실제 정규 표현식"뿐만 아니라 "확장 정규 표현식"을 사용하십시오. "확장 정규 표현식"은 최근 문헌에서 가장 일반적으로 사용되는 용어입니다.

프랑스 학교의 "합리적 표현"이라는 용어를 바탕으로 그 표현이 실제 세계에서 사용된다는 사실을 고려할 때 저는 "실제 표현"을 좋아합니다.

부록 : 박사 학위 논문의 장은이 형식의 공식 언어를 다룹니다 (해당 논문은 STACS 2011에 게재 될 예정입니다). 그 장과 논문을 쓰면서 여러 가지 용어를 실험했습니다. 마지막으로 역 참조가있는 모델에 확장 정규식 을 사용 하고 정상 정규 표현식에 적합한 정규 표현식 을 사용하기로 결정했습니다 . 이미 완전히 (또는 대부분) 작성된 논문에서 용어를 변경하는 것은 상당히 성가 시므로, 일부는 내가 선택한 경험에 관심이있을 것이라고 생각합니다.

첫째, 정규 표현식rewbr 은 실제로 혀를 굴리지 않으며 전체 용지 과정에서 반복해서 사용하는 것은 특히 여러 가지 형태 중 하나를 사용할 때 읽고 쓰는 것이 정말 번거로운 일이었습니다. PERL과 같은 정규 표현식 도 다루기 어려웠습니다. 물론 저는 원어민이 아니므로 YMMV입니다.

둘째, 두 모델에 대해 이야기하고 싶은 경우 정규 표현식 의 변형 인 용어를 사용하는 것이 편리합니다. 이는 필요에 따라 유사성 또는 차이점을 강조 할 수 있기 때문입니다 (예 : "정규 표현식, 적절하거나 펼친"). 게다가, 이것은 다른 모델들을 비교하는 대신에 전체 클래스에서 특별한 경우에 대해 이야기 할 때 "역 참조가없는 확장 된 정규 표현식"의 특별한 경우를 쉽게 강조 할 수있게합니다.

셋째, 나는 새로 등장한 용어에 대해 이미 문헌에서 이미 사용 된 용어를 사용하는 것을 선호하여 확장 정규 표현식실제 정규 표현식 중에서 선택할 수있게 되었습니다 . 두 번째 선택은 (적어도 암시 적으로) 적절한 정규 표현식이 다소 비현실적이며 다소 이상하다고 느꼈습니다 (특히 Google의 RE2가 역 참조를 사용하지 않고 상당히 실용적 인 것처럼 보입니다).

물론,이 선택은 나의 "개인 로컬 최대"일 뿐이며, 필요에 따라 다른 선택이 더 적절할 수 있습니다.


7
불행하게도, 확장 정규 표현식 이라는 용어 는 이미 POSIX에서 사용되었으며 기본 정규 표현식 (BRE)확장 정규 표현식 (ERE) 을 구별합니다 . 둘 다 정의에 따라 확장 정규 표현식입니다.
Jörg W Mittag

@ 르그을 : 사실에 따라 둘 확장되지도 기본 POSIX 정규 표현식 정규 정규 표현식보다 더 강력하다. 그리고 순수 (GNU가 아닌) BRE는 실제로 정규 표현식 (대체 연산자 누락)보다 강력하지 않은 것 같습니다.
sepp2k

이 "rewbr"에 대한 최근 결과는 Carle and Narendran (2009)의 "Extended Regular Expressions"를 참조하십시오. portal.acm.org/citation.cfm?id=1533235
Jakob

이 언어 클래스에 대한 최근 결과 : Campeanu 및 Santean의 "정규 언어와 정규식 언어의 교차점"(TCS 410, 2009) "Reidenbach 및 Schmid의 대규모 정규 표현식의 다항식 시간 일치 테스트"(CIAA 2010) ) 및 "확장 정규 표현식 : 간결함 및 결정 성"(STACS 2011에 표시 될 예정 임).
Dominik D. Freydenberger

6

펄의 소위 정규 표현식은 튜링을 완료하기에 충분히 강력하다는 것이 알려져 있습니다. 일반적인 프로그램에서 perl regexp 로의 컴파일러조차 있습니다.

따라서 이런 종류의 "정규 표현식"의 이름을 검색하는 것이 이치에 맞지 않습니다.

http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm 에서 예를 찾으십시오 .


당신은 몇 가지 포인터가 있습니까?
András Salamon

5
@ András : Arthur가 Perl의 ?{CODE}지시어 에 대해 이야기하고 있다고 생각합니다. 이로 인해 패턴 표현식이 프로그램 코드를 정규 표현식으로 인터리브 할 수 있습니다. PCRE는 일반적으로 언어의 "선언적"부분으로 정의되며, 전체 언어는 패턴 언어라고합니다. WP, Aho, 1990에 따르면, "문자열에서 패턴을 찾기위한 알고리즘"에 따르면 역 추적을 사용하는 일반 언어의 멤버쉽 문제는 NP가 완료된 것입니다. 선언적 PCRE에는 다른 하드 기능이 없습니다.
찰스 스튜어트

나는 링크를 추가했다; 소스 코드를 보지 않았으므로 작동 방식과 컴파일이 실제로 정확하다는 증거가 있는지 잘 모르겠습니다.
Arthur MILCHIOR

1
죄송하지만 귀하의 주장에 따르면 람다 미적분은 Turing-complete이므로 이름을 검색하는 것이 의미가 없습니다. 다른 모든 Turing-complete 계산 형식과 언어에 대해서도 동일합니다. 요컨대, Turing-completeness는 언어의 표현력을 설명하지 않으므로 Turing-complete라는 언어를 식별하는 것은 의미가 없습니다. 람다 미적분에 대한 나의 예는 물론 극단적 인 예였습니다.
Blaisorblade

2

"Automata의 맥락에서 정규 표현"에 대한 최고의 용어는 Sakarovitch의 Automata 이론의 요소 또는 가중 오토마타 핸드북에서 사용되는 "합리적 표현"이라고 생각합니다.


1
자주 사용되지 않는 IMHO.
Blaisorblade

가중 오토마타 이론에서 널리 사용됩니다 ( en.wikipedia.org/wiki/Rational_language 참조) . 나는 그룹 이상의 언어 분야에서도 많은 시간을 보았습니다.
Michaël Cadilhac

1

다른 답변을 감안할 때, 나는 "정규 언어"가 안전하고 그 차이점을 간단히 언급 한 후 정규 표현식에 대한 "실제 정규 표현식"(역 추적)에 대해 이야기하는 것이 좋습니다.

또한 정규 표현식과 실제 표현식과 동일한 정규 표현식은 다른 의미를 가질 수 있습니다. 후자의 경우 의미는 역 추적이라는 용어로 정의되며 결과가 다릅니다. 자세한 내용은 주제가 아닌 것이지만 다른 질문 (여기서는 dunno가 아니라 SO에있을 수 있음)을 물어보고 의견을 말하면 답변 해 드리겠습니다.


0

패턴 표현 이라고 부를 수 있습니다 . 이것은 패턴 언어와 ​​혼동을 일으킬 수 있지만 최소한 덜 일반적입니다.


2
원칙적으로 귀하의 추론에 동의하지만 Campeanu, Santean 및 Yu는 이미 패턴 표현 이라는 용어를 사용하여 "깨끗한"정의를 가진 유사한 언어 클래스를 표시했습니다 ( "패턴 표현 및 패턴 오토마타", IPL 92 (2004) 참조). ).
도미니크 D. Freydenberger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.