정규식

Regular expression
파란색 하이라이트는 정규 표현식 패턴의 일치 결과를 보여줍니다. /h[aeiou]+/g (h 뒤에 하나 이상의 모음이 오는 문자).

정규 표현식([1][2][3]regex 또는 regexp)은 텍스트에서 일치 패턴을 지정하는 문자 시퀀스입니다. 일반적으로 이러한 패턴은 문자열에 대한 "찾기" 또는 "찾기 및 교체" 작업 또는 입력 유효성 검사를 위해 문자열 검색 알고리즘에 의해 사용됩니다. 정규 표현 기법은 이론 컴퓨터 과학형식 언어 이론에서 개발됩니다.

정규 표현의 개념은 미국의 수학자 스티븐 클린정규 언어의 개념을 공식화한 1950년대에 시작되었습니다. 이들은 유닉스 텍스트 처리 유틸리티와 함께 일반적으로 사용하게 되었습니다. 정규 표현식을 쓰기 위한 다양한 구문이 1980년대부터 존재해 왔는데, 하나는 POSIX 표준이고 다른 하나는 널리 사용되는 펄 구문입니다.

정규 표현식은 검색 엔진, 워드 프로세서텍스트 편집기의 검색 및 교체 대화상자, sedAWK와 같은 텍스트 처리 유틸리티 및 어휘 분석에 사용됩니다. 정규 표현식은 많은 프로그래밍 언어에서 지원됩니다. 라이브러리 구현은 종종 "엔진"이라고 불리며,[4][5] 많은 부분을 재사용할 수 있습니다.

역사

컨셉을 소개한 Stephen Cole Kleene

정규 표현식은 1951년 수학자 스티븐 콜 클린(Stephen Cole Kleene)이 정규 사건이라는 수학적 표기법을 사용하여 정규 언어를 설명하면서 비롯되었습니다.[6][7] 이것들은 이론 컴퓨터 과학, 오토마타 이론(계산 모델) 및 공식 언어의 설명 및 분류 분야에서 발생했습니다. 패턴 매칭의 다른 초기 구현에는 정규 표현식을 사용하지 않고 자체 패턴 매칭 구조를 사용하는 SNOBOL 언어가 포함됩니다.

정규 표현식은 1968년부터 텍스트 편집기의[8] 패턴 매칭과 컴파일러의 어휘 분석 두 가지 용도로 대중적으로 사용되기 시작했습니다.[9] 프로그램 형태의 정규 표현식이 처음 등장한 것 에는 켄 톰슨텍스트 파일의 패턴을 일치시키기 위한 수단으로 Kleene의 표기법을 편집기 QED에 내장했을 때가 있습니다.[8][10][11][12] 신속성을 위해 Thompson은 JIT 컴파일의 중요한 초기 예인 호환 시분할 시스템에서 IBM 7094 코드에 JIT(Just-in-time compilition)를 사용하여 정규 표현식 매칭을 구현했습니다.[13] 그는 나중에 유닉스 편집기에 이 기능을 추가했고, 결국 인기 검색 도구 grep가 정규 표현식을 사용하게 되었습니다("grep"는 편집기에서 정규 표현식 검색을 위한 명령어에서 파생된 단어입니다: g/re/p "정규 표현 및 인쇄 일치 라인에 대한 글로벌 검색"을 의미합니다.[14] 톰슨이 QED를 개발한 비슷한 시기에 더글러스 T를 포함한 연구자 그룹. Ross컴파일러 설계에서 어휘 분석에 사용되는 정규 표현식을 기반으로 도구를 구현했습니다.[9]

이러한 원래 형태의 정규 표현식은 1970년대 벨 연구소유닉스[12] 프로그램에서 vi, lex, sed, AWK, expr 등 많은 변형이 사용되었으며, Emacs(자체적으로 호환되지 않는 구문과 동작을 가지고 있음)와 같은 다른 프로그램에서도 사용되었습니다. 레게크스는 이후 다양한 프로그램에 의해 채택되었으며, 이러한 초기 형태는 1992년 POSIX.2 표준에 표준화되었습니다.

1980년대에 Perl에서 더 복잡한 regex가 발생했는데, 이는 원래 Henry Spencer(1986)가 작성한 regex 라이브러리에서 파생되었으며, 나중에 Advanced Regular Expressions라는 Tcl용 구현체를 작성했습니다.[15] Tcl 라이브러리는 성능 특성이 향상된 하이브리드 NFA/DFA 구현입니다. Spencer의 Tcl 정규 표현식 구현을 채택한 소프트웨어 프로젝트로는 Postgre가 있습니다.SQL.[16] Perl은 나중에 Spencer의 원래 라이브러리를 확장하여 많은 새로운 기능을 추가했습니다.[17] Raku (이전 이름은 Perl 6) 설계의 일부는 Perl의 regex 통합을 개선하고, 구문 분석 표현 문법의 정의를 허용하도록 범위와 기능을 증가시키는 것입니다.[18] 그 결과 라쿠 규칙이라고 불리는 미니 언어가 탄생했는데, 이 언어는 라쿠 문법을 정의할 뿐만 아니라 해당 언어의 프로그래머에게 도구를 제공하는 데 사용됩니다. 이러한 규칙은 Perl 5.x regex의 기존 기능을 유지하지만 하위 규칙을 통해 BNF 스타일의 재귀 하강 파서 정의도 허용합니다.

문서 및 데이터베이스 모델링을 위한 구조화된 정보 표준에서 regex의 사용은 1960년대에 시작되어 1980년대에 ISO SGML(ANSI "GCA 101-1983" 이전)과 같은 산업 표준이 통합되면서 확장되었습니다. 구조 사양 언어 표준의 커널은 regex로 구성됩니다. 그 용도는 DTD 요소 그룹 구문에서 분명합니다. 정규 표현식을 사용하기 전에는 많은 검색 언어에서 "*"와 같은 간단한 와일드카드를 사용하여 문자 시퀀스와 일치시키고 "?"는 단일 문자와 일치시켰습니다. 이에 대한 유물은 오늘날 파일 이름에 대한 글로벌 구문과 SQL에서 찾을 수 있습니다. LIKE 교환입니다.

1997년부터 필립 헤이즐(Philip Hazel)은 PCRE(Perl Compatible Regular Expressions)를 개발했는데, 이는 펄의 regex 기능을 면밀히 모방하려는 시도이며 PHPApache HTTP Server를 포함한 많은 현대 도구에서 사용됩니다.[citation needed]

오늘날 regex는 프로그래밍 언어, 텍스트 처리 프로그램(특히 렉서스), 고급 텍스트 편집기 및 기타 프로그램에서 널리 지원됩니다. Regex 지원은 JavaPython을 포함한 많은 프로그래밍 언어의 표준 라이브러리의 일부이며 Perl 및 ECM 스크립트를 포함한 다른 언어의 구문에 내장되어 있습니다. 2010년대 후반, 몇몇 회사들은 CPU 구현에 비해 빠른 PCRE 호환 regex 엔진의 하드웨어, FPGA,[19] GPU[20] 구현을 제공하기 시작했습니다.

패턴

정규 표현식 또는 regexs라는 문구는 아래에 설명된 수학적 표기법과 구별되는 텍스트 일치 패턴을 나타내기 위한 구체적인 표준 텍스트 구문을 의미하는 데 자주 사용됩니다. 정규 표현식의 각 문자(즉, 문자열에서 패턴을 설명하는 각 문자)는 특별한 의미를 가진 메타 문자이거나 문자 그대로의 의미를 가진 정규 문자입니다. 예를 들어, regex에서 b., 'b'는 문자 그대로 'b'와 일치하는 문자이고, '.'는 새 행을 제외한 모든 문자와 일치하는 메타 문자입니다. 따라서 이 regex는 예를 들어 'b%', 'bx' 또는 'b5'와 일치합니다. 메타 문자와 리터럴 문자를 함께 사용하여 특정 패턴의 텍스트를 식별하거나 해당 패턴의 여러 인스턴스를 처리할 수 있습니다. 패턴 일치는 메타 문자에 의해 제어되는 것처럼 정확한 동일성에서 매우 일반적인 유사성까지 다양할 수 있습니다. 예를들면, . 매우 일반적인 패턴입니다. [a-z] ('a'에서 'z'로 모든 소문자 일치) 일반적이지 않고 b 는 정확한 패턴입니다(matches는 그냥 'b'입니다). 메타문자 구문은 다양한 입력 데이터의 텍스트 처리 자동화를 지시하는 간결하고 유연한 방식으로 특정 대상을 표현하도록 특별히 설계되었으며, 표준 ASC를 사용하여 입력하기 쉬운 형태로 제공됩니다.II 키보드.

이 구문에서 정규 표현식의 매우 간단한 경우는 텍스트 편집기에서 철자가 다른 두 가지 방법으로 입력된 단어를 찾는 것입니다. 정규 표현식 seriali[sz]e "serial 크기" 및 "serial 크기"와 모두 일치합니다. 와일드카드 문자도 이를 달성하지만 메타문자 수가 적고 언어 기반이 단순하기 때문에 패턴을 만들 수 있는 것이 더 제한됩니다.

와일드카드 문자의 일반적인 컨텍스트는 파일 목록에서 유사한 이름을 글로브하는 것이지만 regex는 일반적으로 텍스트 문자열을 패턴 일치시키는 응용 프로그램에 사용됩니다. 예를 들어, regex는 ^[ \t]+ [ \t]+$ 행의 시작 또는 끝에 있는 여분의 공백과 일치합니다. 임의의 숫자와 일치하는 고급 정규 표현식은 [+-]?(\d+(\.\d*)? \.\d+)([eE][+-]?\d+)?.

크리네번역하기
(s*는 "0 또는 그 이상의 s"를 의미합니다.)

regex 프로세서는 위 구문의 정규 표현을 실행할 수 있고 검색되는 텍스트를 나타내는 문자열에 대해 일치시킬 수 있는 내부 표현으로 변환합니다. 한 가지 가능한 접근 방식은 비결정론적 유한 오토마톤(NFA)을 구성하기 위한 톰슨의 구성 알고리즘이며, 이는 결정론적으로 만들어지고 결과적인 결정론적 유한 오토마톤(DFA)은 대상 텍스트 문자열에서 실행되어 정규 표현식과 일치하는 하위 문자열을 인식합니다. 사진은 NFA 계획을 보여줍니다. N(s*) 정규식으로부터 얻은 s*, 여기서 sNFA N(s)으로 재귀적으로 변환된 단순한 정규식을 차례로 나타냅니다.

기본개념

종종 패턴이라고 불리는 정규 표현식은 특정 목적에 필요한 문자열 집합을 지정합니다. 유한한 문자열 집합을 지정하는 간단한 방법은 문자열의 요소 또는 구성원을 나열하는 것입니다. 그러나 종종 더 간결한 방법이 있습니다. 예를 들어, 세 개의 문자열 "Handel", "Händel", "Haendel"을 포함하는 집합은 패턴으로 지정할 수 있습니다. H(ä ae?)ndel; 우리는 이 패턴이 세 개의 스트링 각각과 일치한다고 말합니다. 그러나 동일한 문자열 집합에 대해 정규 표현식을 작성하는 방법은 다음과 같이 여러 가지가 있을 수 있습니다. (Hän Han Haen)del 또한 이 예제에서는 동일한 세 개의 문자열 집합을 지정합니다.

대부분의 형식주의는 정규식을 구성하기 위해 다음과 같은 연산을 제공합니다.

부울 "또는"
수직 막대는 대안을 분리합니다. 예를들면, gray grey "gray" 또는 "grey"와 일치할 수 있습니다.
그룹화
괄호연산자의 범위 및 우선 순위를 정의하는 데 사용됩니다(다른 용도 중에서도). 예를들면, gray grey 그리고. gr(a e)y 두 가지 모두 "gray" 또는 "grey"의 집합을 설명하는 동등한 패턴입니다.
정량화
요소 뒤에 있는 한정자(: 토큰, 문자 또는 그룹)는 이전 요소의 반복 허용 횟수를 지정합니다. 가장 일반적인 계량기는 물음표입니다. ?, 별표 * (크리네 별에서 유래), 플러스 기호 + (클라인 플러스).
? 물음표는 이전 요소의 발생 횟수가 0회 또는 1회임을 나타냅니다. 예를들면, colou?r "색"과 "colour" 모두와 일치합니다.
* 별표는 이전 요소의 발생 횟수가 0회 이상임을 나타냅니다. 예를들면, ab*c "ac", "abc", "abbc", "abbbc" 등과 일치합니다.
+ 더하기 기호는 이전 요소가 하나 이상 발생했음을 나타냅니다. 예를들면, ab+c "abc", "abbc", "abbbc" 등과 일치하지만 "ac"는 일치하지 않습니다.
{n}[21] 이전 항목은 정확히 n번 일치합니다.
{min,}[21] 이전 항목은 최소 몇 번 이상 일치합니다.
{,max}[21] 이전 항목은 최대 몇 번까지 일치합니다.
{min,max}[21] 이전 항목은 최소 횟수 이상 최대 횟수 이하로 일치합니다.
와일드카드
와일드카드 . 모든 문자와 일치합니다. 예를들면,
a.b "a"가 포함된 문자열과 일치하고, 그 다음에 임의의 문자와 "b"가 일치합니다.
a.*b "a"가 포함된 문자열과 일치한 다음 나중에 문자 "b"와 일치합니다.

숫자와 연산 +, -, ×, ÷에서 산술식을 구성할 수 있는 것처럼 이러한 구성을 결합하여 임의로 복잡한 표현식을 만들 수 있습니다.

정규 표현식에 대한 정확한 구문은 도구마다 상황에 따라 다릅니다. 자세한 내용은 § 구문에 나와 있습니다.

형식언어론

정규 표현식은 공식 언어 이론에서 정규 언어를 설명합니다. 그들은 일반 문법과 동일한 표현력을 가지고 있습니다.

형식적 정의

정규식은 문자열 집합을 나타내는 상수와 이러한 집합에 대한 연산을 나타내는 연산자 기호로 구성됩니다. 다음 정의는 표준이며 형식 언어 이론에 대한 대부분의 교과서에서 볼 수 있습니다.[22][23] 유한 알파벳 σ가 주어지면 다음 상수가 정규식으로 정의됩니다.

  • (empty set) 설정된 ∅을 나타내는 ∅입니다.
  • (empty string) 문자가 전혀 없는 "empty" 문자열만 포함하는 집합을 나타내는 ε입니다.
  • (literal 문자) a 문자 a만을 포함하는 집합을 나타내는 σ.

정규식 R과 S가 주어졌을 때, 정규식을 생성하기 위해 이들 위에서 다음과 같은 연산이 정의됩니다.

  • (연결) (RS) R이 받아들이는 문자열과 S가 받아들이는 문자열을 연결하여 얻을 수 있는 문자열 집합을 나타냅니다(순서대로). 예를 들어 R을 {"ab", "c"}, S를 {"d", "ef"}로 표시합니다. 그리고나서, (RS) {"abd", "abef", "cd", "cef"}를 나타냅니다.
  • (대체) (R S) R과 S로 설명된 집합의 집합 합을 나타냅니다. 예를 들어, R이 {"ab", "c"}를 설명하고 S가 {"ab", "d", "ef"}, 식을 설명하는 경우 (R S) {"ab", "c", "d", "ef"}에 대해 설명합니다.
  • (클라인 스타) (R*) ε를 포함하고 문자열 연결로 닫혀 있는 R로 설명된 집합의 가장 작은 초집합을 나타냅니다. 이것은 R에 의해 기술된 집합에서 임의의 유한한 수의 문자열(0 포함)을 연결하여 만들 수 있는 모든 문자열의 집합입니다. 예를 들어, R이 {"0", "1"}을 나타내는 경우, (R*) 모든 유한 이진 문자열(빈 문자열 포함)의 집합을 나타냅니다. R이 {"ab", "c"}를 나타내는 경우, (R*) {ε, "ab", "c", "abab", "abab", "abc", "cab", "cc", "abab", "abcab", ...}을 나타냅니다.

괄호를 피하기 위해 Kleene 별의 우선 순위가 가장 높고 연결, 교대 순이라고 가정합니다. 모호함이 없으면 괄호를 생략할 수 있습니다. 예를들면, (ab)c 로 표기할 수 있습니다. abc,그리고. a (b(c*)) 로 표기할 수 있습니다. a bc*. 많은 교재에서 세로 막대 대신 ∪, + 또는 ∨ 기호를 교대로 사용합니다.

예:

  • a b* {ε, "a", "b", "bb", "bb", "bb", "bb", "bb", ...}을 나타냅니다.
  • (a b)* 빈 문자열을 포함하여 "a"와 "b" 이외의 기호가 없는 모든 문자열의 집합을 나타냅니다. {ε, "a", "b", "aa", "ab", "ba", "bb", "bb", "aaa", ...
  • ab*(c ε) "a"로 시작하고, 0 또는 그 이상의 "b"와 선택적으로 "c"를 포함하는 문자열 집합을 나타냅니다. {"a", "ac", "ab", "abc", "ab", "abb", "abbc", ...
  • (0 (1(01*0)*1))* 3의 배수인 이진수 집합을 나타냅니다. {ε, "0", "00", "11", "000", "011", "110", "0000", "0011", "0110", "1001", "1100", "1111", "00000", ...

표현력과 컴팩트함

정규 표현식의 형식적 정의는 의도적으로 최소이며 정의를 피합니다. ? 그리고. +—이는 다음과 같이 표현할 수 있습니다. a+ = aa*,그리고. a? = (a ε). 일반화된 정규 표현식을 제공하기 위해 보완 연산자가 추가되기도 합니다. 여기서 R은 R과 일치하지 않는 σ* 위의 모든 문자열을 일치시킵니다. 원칙적으로 보완 연산자는 더 이상 표현력을 부여하지 않기 때문에 중복됩니다. 그러나 정규 표현식을 훨씬 더 간결하게 만들 수 있습니다. 단일 보완 연산자를 제거하면 길이가 두 로 지수 함수적으로 증가할 수 있습니다.[24][25][26]

이러한 의미의 정규 표현식은 결정론적 유한 오토마타가 수용하는 언어 클래스인 정규 언어를 정확히 표현할 수 있습니다. 그러나 컴팩트함에는 상당한 차이가 있습니다. 정규 언어의 일부 클래스는 가장 짧은 등가 정규 표현식의 크기에서 기하급수적으로 크기가 증가하는 결정론적 유한 오토마타로만 설명할 수 있습니다. 여기서 표준 예는 k-from-lastth 문자가 a인 알파벳 {a,b}의 모든 문자열로 구성된 언어 L입니다k. 한편, 을 기술하는 정규 표현식은 ) ∗ (∣) (∣ bmid b)^{*}a(a\mid b)(a\mid b)(a\mid b)(a\mid b)}에 의해 주어집니다.

패턴을 L로 일반화하면 다음과 같은 식을 얻을 수 있습니다. ) ∗ b {(amid b)(a\mid b)\cdots (a\mid b)} _{k-1{\text{times}}.\,}

반면k L 언어를 받아들이는 모든 결정론적 유한 오토마타는 적어도 2개의k 상태를 가져야 한다고 알려져 있습니다. 다행히도 정규 표현식에서 더 일반적인 비결정론적 유한 오토마타(NFA)로 간단한 매핑이 있어 크기가 크게 증가하지 않습니다. 이러한 이유로 NFA는 종종 정규 언어의 대체 표현으로 사용됩니다. NFA는 Chomsky 계층 구조의 Type-3 문법을 단순 변형한 것입니다.[22]

반대 방향으로는 정규 표현식으로 쉽게 설명되지 않는 DFA로 쉽게 설명되는 언어가 많습니다. 예를 들어, 주어진 ISBN의 유효성을 결정하기 위해서는 정수 베이스 11의 모듈러스를 계산해야 하며, 11-상태 DFA로 쉽게 구현할 수 있습니다. 그러나 정규식으로 변환하면 2,14메가바이트의 파일이 생성됩니다.[27]

정규식이 주어지면 톰슨의 구성 알고리즘은 동등한 비결정론적 유한 오토마타를 계산합니다. Kleene의 알고리즘은 반대 방향으로의 변환을 달성합니다.

마지막으로, 많은 실제 "정규 표현" 엔진이 형식 언어 이론의 의미에서 정규 표현으로 설명할 수 없는 기능을 구현하고 오히려 regex를 구현한다는 점에 주목할 필요가 있습니다. 이에 대한 자세한 내용은 아래를 참조하십시오.

정규 표현식의 등가성 결정

위의 많은 예에서 볼 수 있듯이, 동일한 결과를 얻기 위해 정규식을 구성하는 방법은 한 가지가 아닙니다.

주어진 두 개의 정규 표현식에 대해 설명된 언어가 동일한지 여부를 결정하는 알고리즘을 작성할 수 있습니다. 알고리즘은 각 표현식을 최소 결정론적 유한 상태 기계로 축소하고 동형(동형)인지 여부를 결정합니다.

정규 표현식에 대한 대수적 법칙은 예를 들어 가장 잘 설명된 Gischer의 방법을 사용하여 얻을 수 있습니다. (X+Y)와 (XY)가 동일한 정규 언어를 나타내는지 확인하려면 모든 정규 표현식 X, Y에 대해 특정 정규 표현식 (a+b)와 (ab)가 알파벳 σ={a,b} 위에서 동일한 언어를 나타내는지 확인하는 것이 필요하고 충분합니다. 일반적으로 변수가 있는 정규 express 이온 항 사이의 방정식 E=F는 다른 변수를 다른 기호 상수로 대체한 인스턴스화가 유지되는 경우에만 유지됩니다.

모든 정규 표현식은 유한 단어에 대한 집합 조합크리네 별의 용어로만 쓸 수 있습니다. 이것은 의외로 어려운 문제입니다. 정규 표현식이 간단한 만큼 어떤 일반적인 형태로 체계적으로 다시 쓸 수 있는 방법은 없습니다. 과거에 공리가 부족했기 때문에 별의 높이 문제가 발생했습니다. 1991년 덱스터 코젠(Dexter Kozen)은 등식 및 혼절 공리를 사용하여 정규 표현식을 클라인 대수로 공리화했습니다.[30] 이미 1964년에 Redko는 순수한 등식 공리의 어떤 유한 집합도 정규 언어의 대수를 특징지을 수 없다는 것을 증명했습니다.[31]

구문

regex 패턴은 대상 문자열과 일치합니다. 패턴은 일련의 원자로 구성되어 있습니다. 원자는 대상 문자열과 일치하려고 하는 regex 패턴 내의 단일 점입니다. 가장 간단한 원자는 문자 그대로이지만 패턴의 일부를 원자와 일치하도록 그룹화하려면 사용해야 합니다. ( ) 메타캐릭터로서 메타문자는 원자를 형성하는 데 도움이 됩니다: 원자; 원자의 개수(그리고 욕심 많은 수량자인지 아닌지)를 알려주는 수량자; 일련의 대안을 제공하는 논리적 OR 문자와 원자의 존재를 부정하는 논리적 NOT 문자; 그리고 원자의 완성 패턴의 이전 원자를 가리키는 역참조. 일치는 끈의 모든 원자가 일치하는 것이 아니라, 리젝스의 모든 패턴 원자가 일치하는 것입니다. 이 아이디어는 문자 그대로의 모든 가능성에 대한 많은 목록을 컴파일하는 것이 아니라 작은 패턴의 문자가 많은 수의 가능한 문자열을 나타내도록 하는 것입니다.

regex 프로세서에 따라 문자 그대로의 의미를 가질 수도 있고 가지지 않을 수도 있는 문자가 14개 정도 존재합니다. 즉, 문맥에 따라 또는 "탈출" 여부에 따라, 즉, 탈출 시퀀스 앞에 백슬래시가 뒤따릅니다. \. 현대와 POSIX 확장형 레게크는 문자 그대로의 의미보다 메타문자를 더 자주 사용하므로 "백슬래시-오시스"나 이쑤시개 증후군을 피하기 위해 문자 그대로의 모드로 메타문자 탈출이 가능합니다. 그러나 처음에는 4개의 괄호가 있는 메타문자를 사용합니다. ( ) 그리고. { } 주로 문자 그대로이며, 메타 캐릭터가 되기 위한 일반적인 의미인 "escape"입니다. 공통 표준은 두 가지를 모두 구현합니다. 일반적인 메타 캐릭터는 {}[]()^$. *+? 그리고. \. 탈출하면 메타 캐릭터가 되는 일반적인 캐릭터는 dswDSW 그리고. N.

구분 기호

프로그래밍 언어에서 regex를 입력할 때 일반적인 문자열 리터럴로 표현될 수 있으므로 일반적으로 따옴표로 표시됩니다. 예를 들어, regex는 C, Java, Python에서 일반적으로 사용됩니다. re 로 입력됩니다. "re". 그러나 다음과 같이 슬래시를 구분자로 사용하는 경우가 많습니다. /re/ 렉스를 위해 re. 이것은 ed에서 유래된 것입니다, 어디서. / 는 검색을 위한 편집기 명령이며, 수식입니다. /re/ 선의 범위를 지정하는 데 사용할 수 있습니다(패턴의 matching). 가장 유명한 것은 양쪽의 다른 명령어와 결합할 수 있다는 것입니다. g/re/p grep("global regex print")와 같이 리눅스 배포판과 같은 대부분의 유닉스 기반 운영 체제에 포함되어 있습니다. 검색 및 교체가 제공되는 sed에서도 유사한 규칙이 사용됩니다. s/re/replacement/ 패턴을 쉼표로 연결하여 다음과 같이 선의 범위를 지정할 수 있습니다. /re1/,/re2/. 이 표기법은 일반 문자열 리터럴과 구별되는 구문의 일부를 형성하는 펄(Perl)에서 사용되기 때문에 특히 잘 알려져 있습니다. sed 및 Perl과 같은 경우에는 내용과의 충돌을 피하고 내용에서 구분 기호 문자가 발생하지 않도록 대체 구분 기호를 사용할 수 있습니다. 예를 들어 명령어를 입력했습니다. s,/,X, a를 대체할 것입니다. / 을 가지고 X, 쉼표를 구분 기호로 사용합니다.

표준

IEEE POSIX 표준에는 BRE(기본 정규 표현식),[32] ERE(확장 정규 표현식) 및 SRE(단순 정규 표현식)의 세 가지 규정 준수 세트가 있습니다. SRE는 둘 다 하위 호환성을 제공하기 때문에 [33]BRE에 유리하게 사용되지 않습니다. 문자 클래스를 다루는 아래 섹션은 BRE 및 ERE 모두에 적용됩니다.

BRE와 ERE는 함께 일합니다. ERE 추가 ?, +,그리고. , 메타 캐릭터에서 벗어날 필요가 없어집니다. ( ) 그리고. { }, BRE에서 필요한 것들입니다. 또한, regex에 대한 POSIX 표준 구문을 고수하는 한, 특정(그러나 POSIX 준수) 애플리케이션을 제공하기 위한 추가 구문이 존재할 수 있으며 종종 존재합니다. POSIX.2는 일부 구현 세부 사항을 정의하지 않았지만 BRE와 ERE는 "표준"을 제공하며, 이는 이후 많은 도구의 기본 구문으로 채택되었으며, 여기서 BRE 또는 ERE 모드 선택은 일반적으로 지원되는 옵션입니다. 예를 들어, GNU grep 다음 옵션이 있습니다."grep -E" ERE를 위해, 그리고 "grep -G" BRE(기본값)의 경우 및 ""grep -P" Perl regex의 경우.

펄 레게크스는 풍부하고 강력한 원자 표현 집합을 가진 사실상의 표준이 되었습니다. Perl에는 "기본" 또는 "확장" 수준이 없습니다. As in POSIX EREs, ( ) 그리고. { } 탈출하지 않는 한 메타문자로 취급되며, 다른 메타문자는 문맥만을 기반으로 문자적이거나 상징적인 것으로 알려져 있습니다. 추가 기능에는 레이지 매칭, 백레퍼런스, 명명된 캡처 그룹 및 재귀 패턴이 포함됩니다.

POSIX 기본 및 확장

POSIX 표준에서 BRE(Basic Regular Syntax)는 메타문자를 사용해야 합니다. ( ) 그리고. { } 지정되다 \(\) 그리고. \{\}, ERE(Extended Regular Syntax)는 그렇지 않습니다.

메타문자 묘사
^ 문자열 내의 시작 위치와 일치합니다. 라인 기반 도구에서는 모든 라인의 시작 위치와 일치합니다.
. 모든 단일 문자를 일치시킵니다(많은 응용 프로그램이 행을 제외하고, 정확히 어떤 문자가 새 행으로 간주되는지는 맛, 문자 인코딩 및 플랫폼 고유이지만, 라인 피드 문자가 포함되어 있다고 가정해도 무방합니다). POSIX 괄호 식에서 점 문자는 문자 그대로의 점과 일치합니다. 예를들면, a.c "abc" 등과 일치하지만, [a.c] "a", "." 또는 "c"만 일치합니다.
[ ] 괄호 식. 괄호 안에 포함된 단일 문자를 일치시킵니다. 예를들면, [abc] "a", "b" 또는 "c"와 일치합니다. [a-z] "a"에서 "z"까지의 소문자와 일치하는 범위를 지정합니다. 다음 양식을 혼합할 수 있습니다. [abcx-z] "a", "b", "c", "x", "y" 또는 "z"와 일치합니다. [a-cx-z].

- 문자가 마지막이거나 첫 번째인 경우 문자로 처리됩니다(다음 문자 이후). ^, 있는 경우) 괄호 안의 문자: [abc-], [-abc]. 백슬래시 탈출은 허용되지 않습니다.] 문자가 첫 번째(다음)이면 괄호 식에 포함할 수 있습니다. ^) 문자: []abc].

[^ ] 괄호 안에 포함되지 않은 단일 문자를 일치시킵니다. 예를들면, [^abc] "a", "b" 또는 "c" 이외의 다른 문자와 일치합니다. [^a-z] "a"에서 "z"까지의 소문자가 아닌 모든 단일 문자와 일치합니다. 마찬가지로 문자와 범위를 혼합할 수 있습니다.
$ 문자열의 끝 위치 또는 문자열 끝 새 줄 직전의 위치를 일치시킵니다. 라인 기반 도구에서는 모든 라인의 종료 위치와 일치합니다.
( ) 표시된 하위 표현식을 정의합니다. 괄호 안에 일치하는 문자열은 나중에 호출할 수 있습니다(다음 항목 참조, \n). 표시된 하위 표현식을 블록 또는 캡처 그룹이라고도 합니다. BRE 모드가 필요합니다.
\n n번째로 표시된 하위 표현식이 일치하는 것과 일치합니다. 여기서 n은 1에서 9까지의 숫자입니다. 이 구조는 POSIX 표준에 정의되어 있습니다.[34] 일부 도구에서는 9개 이상의 캡처 그룹을 참조할 수 있습니다. 백 레퍼런스라고도 하는 이 기능은 BRE 모드에서 지원됩니다.
* 이전 요소와 0번 이상 일치합니다. 예를들면, ab*c "ac", "abc", "abb bc" 등과 일치합니다. [xyz]* "x", "y", "z", "z", "zx", "zyx", "xyzzy" 등과 일치합니다. (ab)* ", "ab", "abab", "abab", "abab" 등과 일치합니다.
{m,n} 이전 요소와 m 이상 n번 이하로 일치시킵니다. 예를들면, a{3,5} "aaa", "aaaa" 및 "aaaaaa"와만 일치합니다. 이것은 일부 오래된 레게크 사례에서는 발견되지 않습니다. BRE 모드는 필요합니다. \{m,n\}.

예:

  • .at "at", "cat", "bat", "4at", "#at" 및 "at"(공간으로 시작)을 포함하여 "at"으로 끝나는 모든 3자 문자열과 일치합니다.
  • [hc]at "모자"와 "고양이"와 일치합니다.
  • [^b]at 일치하는 모든 문자열을 일치시킵니다. .at "박쥐"는 제외하고요.
  • [^hc]at 일치하는 모든 문자열을 일치시킵니다. .at "모자"와 "고양이" 외에는요.
  • ^[hc]at "모자"와 "고양이"와 일치하지만 문자열 또는 줄의 시작 부분에만 일치합니다.
  • [hc]at$ "모자"와 "고양이"와 일치하지만 문자열 또는 줄의 끝에서만 일치합니다.
  • \[.\] 괄호가 빠져 있으므로 "[a]", "[b]", "[7]", "[@]", "[]", "[]"(bracket 공백 괄호) 등으로 둘러싸인 모든 문자와 일치합니다.
  • s.* 예를 들어, "s", "saw", "seed", "s3w96.7", "s6#h%(>>>mnmQ"와 같은 0개 이상의 문자가 일치합니다.

Ross Cox에 따르면 POSIX 사양은 Perl과 다른 방식으로 처리해야 하는 모호한 하위 표현이 필요합니다. 위원회는 Perl의 규칙을 설명하기 쉬운 규칙으로 대체했지만, 새로운 "단순한" 규칙은 실제로 구현하기가 더 복잡합니다. 즉, 기존 툴링과 호환되지 않고 "거친 일치"(아래 참조) 확장을 정의하는 것이 본질적으로 불가능했기 때문입니다. 그 결과, POSIX 하위 표현 규칙을 실제로 구현하는 프로그램은 거의 없습니다(POSIX 구문의 다른 부분을 구현하는 경우에도 마찬가지입니다).[35]

POSIX 확장

POSIX ERE(Extended Regular Expression) 구문의 일부 문자에 대해 백슬래시로 빠져나간 메타 문자의 의미가 반대로 표시됩니다. 이 구문을 사용하면 백슬래시를 사용하면 메타 문자가 문자로 처리됩니다. 그러니까 예를 들면. \( \) 지금은 ( ) 그리고. \{ \} 지금은 { }. 추가적으로 지원이 제거됩니다. \n 백레퍼런스 및 다음 메타문자가 추가됩니다.

메타문자 묘사
? 이전 요소를 0 또는 1회 일치시킵니다. 예를들면, ab?c "ac" 또는 "abc"만 일치합니다.
+ 이전 요소와 한 번 이상 일치시킵니다. 예를들면, ab+c "abc", "abbc", "abbbc" 등과 일치하지만 "ac"는 일치하지 않습니다.
선택(대체 또는 집합 결합이라고도 함) 연산자는 연산자 이전 식 또는 이후 식 중 하나와 일치합니다. 예를들면, abc def "abc" 또는 "def"와 일치합니다.

예:

  • [hc]?at "at", "hat", "cat"과 일치합니다.
  • [hc]*at "at", "hat", "cat", "hat", "hat", "hat", "chat" 등과 일치합니다.
  • [hc]+at "hat", "cat", "hat", "hat", "chat", "cchchat" 등과 일치하지만 "at"에서는 일치하지 않습니다.
  • cat dog "고양이" 또는 "개"와 일치합니다.

POSIX 확장 정규 표현식은 종종 명령줄 플래그를 포함하여 현대 유닉스 유틸리티와 함께 사용할 수 있습니다. -E.

문자반

문자 클래스는 문자 일치 후 가장 기본적인 regex 개념입니다. 하나의 작은 문자 시퀀스가 더 큰 문자 세트와 일치하도록 만듭니다. 예를들면, [A-Z] 영어 알파벳의 대문자를 나타낼 수 있고, \d 모든 숫자를 의미할 수 있습니다. 문자 클래스는 두 POSIX 레벨에 모두 적용됩니다.

다음과 같이 문자 범위를 지정하는 경우 [a-Z] (즉, 소문자에서 대문자로), 컴퓨터의 로케일 설정은 문자 인코딩의 숫자 순서로 내용을 결정합니다. 그 순서대로 숫자를 저장할 수도 있고, 순서가 abc일 수도 있습니다...zABC...Z, or aAbBcC...zZ. 따라서 POSIX 표준은 문자 클래스를 정의하며, 이 클래스는 설치된 regex 프로세서에 의해 알 수 있습니다. 이러한 정의는 다음 표에 나와 있습니다.

묘사 포식스 Perl/Tcl Vim 자바 아스키
ASCII 문자 \p{ASCII} [\x00-\x7F]
영숫자 [:alnum:] \p{Alnum} [A-Za-z0-9]
영숫자 + "_" \w \w \w [A-Za-z0-9_]
단어가 아닌 문자 \W \W \W [^A-Za-z0-9_]
알파벳 문자 [:alpha:] \a \p{Alpha} [A-Za-z]
공백 및 탭 [:blank:] \s \p{Blank} [ \t]
단어 경계 \b \< \> \b (?<=\W)(?=\w) (?<=\w)(?=\W)
단어가 아닌 경계 \B (?<=\W)(?=\W) (?<=\w)(?=\w)
제어 문자 [:cntrl:] \p{Cntrl} [\x00-\x1F\x7F]
자리수 [:digit:] \d \d \p{Digit} 또는 \d [0-9]
비자리수 \D \D \D [^0-9]
보이는 문자 [:graph:] \p{Graph} [\x21-\x7E]
소문자 [:lower:] \l \p{Lower} [a-z]
보이는 문자와 공백 문자 [:print:] \p \p{Print} [\x20-\x7E]
구두점 문자 [:punct:] \p{Punct} [][!"#$%&'()*+,./:;<=>?@\^_`{ }~-]
공백 문자 [:space:] \s \_s \p{Space} 또는 \s [ \t\r\n\v\f]
공백이 아닌 문자 \S \S \S [^ \t\r\n\v\f]
대문자 [:upper:] \u \p{Upper} [A-Z]
16진수 [:xdigit:] \x \p{XDigit} [A-Fa-f0-9]

POSIX 문자 클래스는 괄호 식 내에서만 사용할 수 있습니다. 예를들면, [[:upper:]ab] 대문자와 소문자 "a"와 "b"가 일치합니다.

일부 도구에 의해 이해되는 추가적인 Non-POSIX 클래스는 다음과 같습니다. [:word:], 일반적으로 다음과 같이 정의됩니다. [:alnum:] 밑줄을 더합니다. 이것은 많은 프로그래밍 언어에서 식별자에 사용될 수 있는 문자라는 사실을 반영합니다. 편집기 Vim워드워드-헤드 클래스를 더 구분합니다(표기법을 사용하여). \w 그리고. \h) 많은 프로그래밍 언어에서 식별자를 시작할 수 있는 문자는 다른 위치에서 발생할 수 있는 문자와 같지 않기 때문에: 숫자는 일반적으로 제외되므로 식별자는 다음과 같이 보입니다. \h\w* 또는 [[:alpha:]_][[:alnum:]_]* POSIX 표기법으로.

POSIX regex 표준에서 문자 클래스라고 부르는 것은 일반적으로 이를 지원하는 다른 regex 맛에서 POSIX 문자 클래스라고 합니다. 대부분의 다른 regex 맛과 함께 문자 클래스라는 용어는 POSIX가 괄호 표현이라고 부르는 것을 설명하는 데 사용됩니다.

Perl 및 PCRE

표현력과 (상대적으로) 읽기 쉽기 때문에 다른 많은 유틸리티 및 프로그래밍 언어들은 과 유사한 구문을 채택했습니다. 예를 들어 자바, 자바스크립트, 줄리아, 파이썬, 루비, Qt, 마이크로소프트 등입니다.NET FrameworkXML 스키마. BoostPHP와 같은 일부 언어 및 도구는 여러 regex 맛을 지원합니다. Perl-derivative regex 구현은 동일하지 않으며 일반적으로 1994년에 출시된 Perl 5.0에서 볼 수 있는 기능의 하위 집합을 구현합니다. Perl은 때때로 다른 언어에서 처음 발견되는 기능을 통합합니다. 예를 들어, Perl 5.10은 원래 PCRE 및 Python에서 개발된 구문 확장을 구현합니다.[36]

레이지 매칭

Python 및 일부 다른 구현(예: Java)에서, 3개의 일반적인 정량자(quantifier).*, + 그리고. ?)는 최대한 많은 문자가 일치하기 때문에 기본적으로 욕심이 있습니다.[37] 레젝스 ".+" (이중 quotes 포함) 현에 적용됨

그는 이어 "가니메데는 태양계에서 가장 큰 달"이라고 말했습니다. 

첫 번째 부분만 일치시키는 대신 전체 라인을 일치시킵니다(전체 라인이 이중 quote로 시작되고 끝나기 때문). "Ganymede,". 그러나 앞에서 언급한 수량화자는 물음표를 붙여 가능한 한 적은 수의 문자와 일치하도록 게으르거나 최소화하거나 꺼리게 할 수 있습니다. ".+?" 일치만 "Ganymede,".[37]

소유매칭

자바와 파이썬 3.11+[38]에서 수량화자는 플러스 기호를 추가하여 소유적으로 만들 수 있으며, 이 기호는 (역추적 엔진에서) 백오프를 비활성화합니다.[39] regex가 있는 동안 ".*" 현에 적용된

그는 이어 "가니메데는 태양계에서 가장 큰 달"이라고 말했습니다. 

전체 라인인 regex와 일치합니다. ".*+" 전혀 일치하지 않습니다. 왜냐하면 .*+ 최종 입력을 포함한 전체 입력을 소비합니다. ". 따라서 소유형 계량기는 예를 들어 부정 문자 클래스에서 가장 유용합니다. "[^"]*+", 일치하는 "Ganymede," 동일한 문자열에 적용할 경우.

동일한 기능을 수행하는 또 다른 일반적인 확장은 괄호로 묶은 그룹에 대한 역추적을 비활성화하는 원자 그룹화입니다. 일반적인 구문은 (?>그룹). 예를 들어, ^(wi w)i$wiwii 모두와 일치하는 반면, ^(?>wi)i$엔진이 역추적이 금지되어 있으므로 "wi"와 일치한 후 그룹을 "w"로 설정할 수 없습니다.[40]

소유형 계량기는 탐욕스럽고 게으른 계량기보다 구현하기 쉽고 일반적으로 런타임에 더 효율적입니다.[39]

비정규 언어의 패턴

현대의 거의 모든 정규 표현 라이브러리에서 볼 수 있는 많은 기능은 정규 언어를 능가하는 표현력을 제공합니다. 예를 들어, 많은 구현에서는 괄호로 하위 표현식을 그룹화하고 동일한 표현식(뒷줄 참조)에서 일치하는 값을 호출할 수 있습니다. 이것은 무엇보다도, 어떤 패턴이 공식 언어 이론에서 사각형이라고 불리는 "papa"나 "WikiWiki"와 같은 반복되는 단어의 문자열과 일치할 수 있다는 것을 의미합니다. 이 스트링들의 패턴은 (.+)\1.

사각형의 언어는 펌핑 보조정리로 인해 규칙적이지도 않고 문맥에 구애받지도 않습니다. 그러나 수많은 현대 도구에서 지원하는 것처럼 무한한 수의 백레퍼런스를 가진 패턴 매칭은 여전히 컨텍스트에 민감합니다.[41] 임의의 수의 백레퍼런스를 매칭하는 일반적인 문제는 NP-완전이며, 알려진 알고리즘의 실행 시간은 사용된 백레퍼런스 그룹의 수만큼 기하급수적으로 증가합니다.[42]

그러나 이러한 구성을 제공하는 많은 도구, 라이브러리 및 엔진은 여전히 패턴에 정규 표현식이라는 용어를 사용합니다. 이로 인해 정규 표현이라는 용어가 형식 언어 이론과 패턴 매칭에서 다른 의미를 갖는 명명법으로 이어졌습니다. 이러한 이유로 일부 사람들은 후자를 설명하기 위해 regex, regexp 또는 단순히 패턴이라는 용어를 사용했습니다. 펄 프로그래밍 언어의 저자인 래리 월은 라쿠의 디자인에 대해 에세이에 다음과 같이 쓰고 있습니다.

"정규 표현식" […]은(는) 실제 정규 표현식과 거의 관련이 없습니다. 그럼에도 불구하고 이 용어는 패턴 매칭 엔진의 기능과 함께 성장했기 때문에 여기서 언어적 필요성과 싸우려고 하지는 않을 것입니다. 하지만 저는 일반적으로 그들을 "레게크스"(또는 "레게크센")라고 부릅니다. 제가 앵글로색슨의 기분일 때 말이죠.[18]

주장

주장. 뒤를 보다 앞을 보다
포지티브 (?<=pattern) (?=pattern)
아니요. (?<!pattern) (?!pattern)
뒤를 돌아보고 앞을 내다보는 주장
Perl 정규식으로

정규 언어를 설명할 때 찾을 수 없는 다른 기능에는 어설션이 포함됩니다. 여기에는 유비쿼터스가 포함됩니다. ^ 그리고. $, 적어도 1970년부터 [43]사용되었으며 1994년에 등장한 룩어라운드와 같은 좀 더 정교한 확장 기능도 있습니다.[44] 둘러보기는 일치 항목의 주변을 정의하며 문자열 검색의[citation needed] 사용 사례에만 관련된 기능인 일치 항목 자체로 유출되지 않습니다. 그들 중 일부는 주변 환경도 언어의 일부로 취급하여 일반 언어로 시뮬레이션할 수 있습니다.[45]

이러한 전향적 주장은 Perl 5부터 시작하여 적어도 1994년부터 검증되었습니다.[44] 일리야 자하레비치(Ilya Zakharevich)가 Perl 5.005에 제출한 약속에서 1997년부터 이러한 주장이 입증되었습니다.[46]

구현 및 실행 시간

주어진 regex가 문자열과 일치하는지 여부와 방법을 결정하는 알고리즘은 적어도 세 가지가 있습니다.

가장 오래되고 빠른 것은 모든 비결정론적 유한 오토마톤(NFA)을 결정론적 유한 오토마톤(DFA)으로 변환할 수 있는 형식 언어 이론의 결과에 의존합니다. DFA는 명시적으로 구성된 다음 결과 입력 문자열에서 한 번에 하나의 기호로 실행할 수 있습니다. 크기 m의 정규 표현식에 대한 DFA를 구성하는 것은 O(2m)의 시간 및 메모리 비용을 가지지만, 시간 O(n)에서 크기 n의 문자열로 실행할 수 있습니다. 수식의 크기는 숫자 계량기와 같은 축약어를 확장한 후의 크기입니다.

대안적인 접근 방식은 NFA를 직접 시뮬레이션하여 기본적으로 각 DFA 상태를 온 디맨드로 구축한 다음 다음 단계에서 폐기하는 것입니다. 이렇게 하면 DFA가 암시적으로 유지되고 기하급수적인 구축 비용을 피할 수 있지만 실행 비용은 O(mn)로 상승합니다. 명시적 접근법은 DFA 알고리즘, 암묵적 접근법은 NFA 알고리즘이라고 합니다. NFA 알고리즘에 캐싱을 추가하는 것은 종종 "레이지 DFA" 알고리즘 또는 구별하지 않고 DFA 알고리즘이라고 불립니다. 이러한 알고리즘은 빠르지만 그룹화된 하위 표현, 게으른 정량화 및 유사한 기능을 회상하는 데 사용하기가 어렵습니다.[47][48] 현대적인 구현에는 Cox의 코드에 기반한 re1-re2-sregex 계열이 포함됩니다.

세 번째 알고리즘은 역추적을 통해 패턴을 입력 문자열과 일치시키는 것입니다. 이 알고리즘은 일반적으로 NFA라고 불리지만, 이 용어는 혼란스러울 수 있습니다. 실행 시간은 기하급수적일 수 있으며, 간단한 구현은 다음과 같은 식과 일치할 때 표시됩니다. (a aa)*b 대체 및 무한 정량화를 모두 포함하며 알고리즘이 기하급수적으로 증가하는 하위 사례를 고려하도록 강제합니다. 이 동작으로 인해 ReDoS(정규 표현 서비스 거부)라는 보안 문제가 발생할 수 있습니다.

역추적 구현은 최악의 경우 기하급수적인 보장만 제공하지만 훨씬 더 큰 유연성과 표현력을 제공합니다. 예를 들어, 역참조를 사용할 수 있게 하거나 Perl이 도입한 다양한 확장을 구현하는 모든 구현에는 일종의 역추적 기능이 포함되어야 합니다. 일부 구현은 먼저 빠른 DFA 알고리즘을 실행하여 두 알고리즘 모두의 최상의 기능을 제공하려고 시도하고, 일치 중에 백레퍼런스가 발생하는 경우에만 잠재적으로 더 느린 역추적 알고리즘으로 되돌아갑니다. GNU grep(및 기본 gnulib DFA)는 이러한 전략을 사용합니다.[49]

보이어-무어(BM) 기반 알고리즘과 역스캔과 같은 관련 DFA 최적화 기술을 사용하여 하위 선형 런타임 알고리즘을 달성했습니다.[50] 다양한 POSIX 구문과 확장을 지원하는 GNU grep은 첫 번째 패스 프리필터링에 BM을 사용한 다음 암시적 DFA를 사용합니다. 대략적인 매칭을 구현하는 Wuagrep은 프리필터링을 BDM(backward DAWG matching)의 DFA에 결합합니다. NR-grep의 BNDM은 Shift-Orbit-level 병렬화로 BDM 기법을 확장합니다.[51]

역참조에 대한 역추적에 대한 몇 가지 이론적 대안이 존재하며, 이들의 "비용"은 POSIX와 같은 일부 레지엑스피 언어의 고정된 속성인 역참조의 수와 관련이 있을 뿐이라는 점에서 변조됩니다. 각 백레퍼런스 노트에 대해 역추적이 불가능한 NFA를 복제하는 한 순진한 방법은 RegExp에서 길이 n과 k 백레퍼런스의 건초 스택에 대해 + style + 2 시간과 + style + 1 공간의 복잡성을 갖습니다.[52] 메모리 오토마타를 기반으로 한 매우 최근의 이론적 연구는 사용된 "활성" 변수 노드를 기반으로 더 엄격한 경계를 제공하고 일부 역참조된 regexp에 대한 다항식 가능성을 제공합니다.[53]

유니코드

이론적인 측면에서 어떤 토큰 집합도 미리 정의되어 있으면 정규 표현식으로 매칭할 수 있습니다. 과거 구현의 관점에서, regex는 원래 ASCII 문자를 토큰 세트로 사용하기 위해 작성되었지만 regex 라이브러리는 수많은 다른 문자 세트를 지원했습니다. 많은 최신 regex 엔진은 유니코드에 대한 최소한의 지원을 제공합니다. 대부분의 경우 문자 집합이 무엇인지는 상관없지만 유니코드를 지원하기 위해 regex를 확장할 때 몇 가지 문제가 발생합니다.

  • 지원되는 인코딩입니다. 일부 regex 라이브러리는 추상 유니코드 문자 대신 일부 특정 인코딩에서 작동하기를 기대합니다. 이들 중 많은 부분이 UTF-8 인코딩을 필요로 하는 반면, 다른 것들은 UTF-16 또는 UTF-32를 기대할 수 있습니다. 이와 대조적으로 Perl과 Java는 인코딩에 불가지론적이며, 대신 내부적으로 디코딩된 문자에 대해 작동합니다.
  • 지원되는 유니코드 범위입니다. 많은 regex 엔진은 기본 다국어 평면, 즉 16비트만으로 인코딩할 수 있는 문자만 지원합니다. 현재 (2016년 기준) 일부 regex 엔진(예: Perl 및 Java)만이 전체 21비트 유니코드 범위를 처리할 수 있습니다.
  • ASCII 지향 구조를 유니코드로 확장합니다. 예를 들어, ASCII 기반 구현에서 양식의 문자 범위 [x-y] xy가 [0x00,0x7F] 범위의 코드 포인트와 코드 포인트(x) ≤ 코드 포인트(y)를 갖는 경우 모두 유효합니다. 이러한 문자 범위를 유니코드로 자연스럽게 확장하면 엔드포인트가 [0x00,0x7F]에 있어야 하는 요구 사항이 [0x00,0x10]에 있어야 하는 요구 사항으로 변경됩니다.FFF. 그러나 실제로는 그렇지 않은 경우가 많습니다. gawk와 같은 일부 구현은 문자 범위가 유니코드 블록을 교차하는 것을 허용하지 않습니다. [0x61,0x7F]와 같은 범위는 두 끝점이 기본 라틴 블록에 속하므로 유효하지만 [0x0530,0x0560]과 마찬가지로 두 끝점이 아르메니아 블록에 속하므로 [0x0061,0x0532]와 같은 범위는 여러 유니코드 블록을 포함하므로 유효하지 않습니다. Vim 편집기와 같은 다른 엔진은 블록 교차를 허용하지만 문자 값이 256을 초과해서는 안 됩니다.[54]
  • 사건 불감증. 일부 대소문자 구분 플래그는 ASCII 문자에만 영향을 미칩니다. 다른 플래그는 모든 캐릭터에 영향을 미칩니다. 일부 엔진에는 두 개의 서로 다른 플래그가 있습니다. 하나는 ASCII이고 다른 하나는 유니코드입니다. 정확히 어떤 문자가 POSIX 클래스에 속하는지도 다양합니다.
  • 사건 불감증의 사촌. ASCII에 대소문자 구분이 있기 때문에 문자 검색에서 대소문자 불감증은 논리적 특징이 되었습니다. 유니코드는 데바나가리처럼 알파벳 문자 스크립트를 대소문자 없이 도입했습니다. 이들의 경우 대소문자 민감도가 적용되지 않습니다. 중국어와 같은 스크립트의 경우, 전통적인 것과 단순화된 것 사이의 또 다른 차이점은 논리적으로 보입니다. 아랍어 문자에서는 초성, 중성, 종성, 고립된 위치에 대한 둔감함이 요구될 수 있습니다. 일본어에서는 히라가나가타카나 사이의 불감증이 유용한 경우가 있습니다.
  • 정규화. 유니코드에는 결합 문자가 있습니다. 오래된 타자기와 마찬가지로 일반 기본 문자(백색 공백, 문장 부호, 기호, 숫자 또는 문자) 뒤에 하나 이상의 공백이 없는 기호(일반적으로 문자를 수정하는 악센트 표시와 같은 격음 기호)를 붙여 하나의 인쇄 가능한 문자를 만들 수 있지만 유니코드는 미리 구성된 문자 집합을 제한적으로 제공합니다. 하나 이상의 결합 문자를 이미 포함하고 있는 문자입니다. 기본 문자 + 결합 문자의 시퀀스는 동일한 단일 사전 구성 문자와 일치해야 합니다(이러한 결합 시퀀스 중 일부만 단일 유니코드 문자로 사전 구성할 수 있지만 유니코드에서는 무한히 많은 다른 결합 시퀀스가 가능하며 다양한 언어에 필요합니다. 초기 기본 문자 뒤에 하나 이상의 결합 문자를 사용하는 것; 이러한 결합 시퀀스는 부분적으로 미리 구성된 기본 문자 또는 결합 문자를 포함할 있지만, 반드시 표준 순서로, 반드시 표준 사전 구성을 사용하는 것은 아닙니다). 표준화(normalization)는 기본 문자의 시퀀스를 표준화하고 이러한 표준적으로 동등한 시퀀스를 분해하여 문자를 결합하는 과정을 의미합니다(선택적으로 일부 결합 문자를 선행 기본 문자로 재구성).
  • 새로운 제어 코드. 유니코드는 바이트 순서 표시와 텍스트 방향 표시 중에서 소개되었습니다. 이러한 코드는 특별한 방식으로 처리해야 할 수도 있습니다.
  • 유니코드 블록, 스크립트 및 기타 수많은 문자 속성에 대한 문자 클래스 소개. 블록 속성은 여러 다른 스크립트의 코드 포인트를 가질 수 있고, 스크립트는 여러 다른 블록의 코드 포인트를 가질 수 있기 때문에 스크립트 속성보다 훨씬 덜 유용합니다.[55] Perl and the java.util.regex 라이브러리, 양식의 속성 \p{InX} 또는 \p{Block=X} 블록 X 및 블록의 문자 일치 \P{InX} 또는 \P{Block=X} 해당 블록에 없는 코드 포인트와 일치합니다. 유사하게, \p{Armenian}, \p{IsArmenian}, 또는 \p{Script=Armenian} Armenian 스크립트의 모든 문자와 일치합니다. 일반적으로. \p{X} 임의의 문자를 이진 속성 X 또는 일반 범주 X와 일치시킵니다. 예를들면, \p{Lu}, \p{Uppercase_Letter}, 또는 \p{GC=Lu} 모든 대문자와 일치합니다. 일반 범주가 아닌 이진 속성은 다음과 같습니다. \p{White_Space}, \p{Alphabetic}, \p{Math},그리고. \p{Dash}. 비이진 속성의 예는 다음과 같습니다. \p{Bidi_Class=Right_to_Left}, \p{Word_Break=A_Letter},그리고. \p{Numeric_Value=10}.

언어지원

대부분의 범용 프로그래밍 언어는 기본적으로 또는 라이브러리를 통해 regex 기능을 지원합니다. 포괄적인 지원은 다음에 포함됩니다.

사용하다

잘못된 제목을 식별하기 위해 정규 표현을 사용하는 위키백과블랙리스트

레지크스는 다양한 텍스트 처리 작업, 일반적으로 데이터가 텍스트일 필요가 없는 문자열 처리에서 유용합니다. 일반적인 응용 프로그램에는 데이터 검증, 데이터 스크래핑(특히스크래핑), 데이터 랭글링, 간단한 구문 분석, 구문 강조 시스템 제작 및 기타 많은 작업이 포함됩니다.

regex는 인터넷 검색 엔진에서 유용하지만 전체 데이터베이스에서 이를 처리하는 것은 regex의 복잡성과 설계에 따라 과도한 컴퓨터 리소스를 소비할 수 있습니다. 많은 경우 시스템 관리자가 내부적으로 regex 기반 쿼리를 실행할 수 있지만 대부분의 검색 엔진은 일반인에게 regex 지원을 제공하지 않습니다. 주목할 만한 예외로는 구글 코드 검색Exalead가 있습니다. 하지만 구글 코드 검색은 2012년 1월에 종료되었습니다.[66]

특정 구문 규칙은 사용 중인 특정 구현, 프로그래밍 언어 또는 라이브러리에 따라 다릅니다. 또한 regex 구현의 기능은 버전마다 다를 수 있습니다.

regex는 예제 없이 설명하고 이해하기 어려울 수 있기 때문에 regex를 테스트하기 위한 대화형 웹 사이트는 실험을 통해 regex를 학습하는 데 유용한 리소스입니다. 이 섹션에서는 그림을 통해 regex의 몇 가지 속성에 대한 기본 설명을 제공합니다.

예제에는 다음과 같은 규칙이 사용됩니다.[67]

메타문자;; 메타문자 열에 = ~ m//; 시연할 regex 구문을 지정합니다. Perl = ~ s//;에서 regex 일치 작업을 나타냅니다. Perl에서 regex 대체 작업을 나타냅니다. 

또한 주목할 점은 이러한 regex가 모두 Perl과 유사한 구문이라는 것입니다. 표준 POSIX 정규 표현식이 다릅니다.

달리 명시되지 않는 한 다음 예제는 2006년 1월 31일 릴리스 5.8.8을 따르는 펄 프로그래밍 언어입니다. 이는 다른 구현이 여기에 표시된 구문의 일부에 대한 지원이 부족할 수 있음을 의미합니다(예: 기본 대 확장 regex, \( \) 대. (), 또는 부족한 \d POSIX 대신에 [:digit:]).

이 예제에서 사용된 구문과 규칙은 다른 프로그래밍 환경의 구문과 일치합니다.[68]

메타 ­ 문자 묘사 예제[69]
. 일반적으로 새 행을 제외한 모든 문자와 일치합니다.
대괄호 안에서 점은 문자 그대로입니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/...../) {   활자로 인쇄하다 "$string1의 길이는 >= 5.\n입니다."; } 

출력:

안녕 세계  >= 5의 길이를 가지고 있습니다. 
( ) 일련의 패턴 요소를 단일 요소로 그룹화합니다.
괄호 안의 패턴을 일치시킬 때 다음 중 하나를 사용할 수 있습니다. $1, $2, ...나중에 이전에 일치한 패턴을 참조합니다. 일부 구현은 백슬래시 표기법을 대신 사용할 수 있습니다. 예를 들어, \1, \2.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/(H..)(o..)) {   활자로 인쇄하다 "'$1'과 '$2'를 맞췄습니다."\n"; } 

출력:

Hel과 o W를 맞췄습니다. 
+ 이전 패턴 요소와 한 번 이상 일치시킵니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/l+/) {   활자로 인쇄하다 "$string1에 연속된 문자 \"l\"이 하나 이상 있습니다.\n"; } 

출력:

Hello World에는 연속된 글자 "l"이 하나 또는 여러 개 있습니다. 
? 이전 패턴 요소를 0 또는 1회 일치시킵니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/H.?e/) {   활자로 인쇄하다 "'H'와 'e'가 구분되어 있습니다.";   활자로 인쇄하다 "0-1개의 캐릭터(예: 허휴희).\n"; } 

출력:

0-1자로 구분된 'H'와 'e'가 있습니다(예: 허휴희). 
? 를 수정합니다. *, +, ? 또는 {M,N}가능한 한 적게 맞추기 위해 앞에 오는 dregex.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/(l.+?o)/) {   활자로 인쇄하다 "'l'과의 욕심 없는 경기 뒤에 하나 또는 ";   활자로 인쇄하다 "'lo Wo'보다는 'lo'가 더 많습니다.\n"; } 

출력:

'l'에 이어 하나 이상의 문자가 나오는 욕심 없는 대결은 'lo Wo'가 아닌 'lo'입니다. 
* 이전 패턴 요소와 0번 이상 일치시킵니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/el*o/) {   활자로 인쇄하다 "'e' 뒤에 0에서 많은 것이 뒤따릅니다.";   활자로 인쇄하다 "'l' 뒤에 'o'(예: eo, elo, elo, elo, elo)가 이어집니다.\n"; } 

출력:

'e' 뒤에 0에서 많은 'l' 뒤에 'o'(eo, elo, elo, elo, elo)가 뒤따릅니다. 
{M,N} 최소 M 및 최대 N 일치 수를 나타냅니다.
N은 생략할 수 있고 M은 0일 수 있습니다. {M} "정확히" M번 일치합니다. {M,} "적어도" M번 일치합니다. {0,N} "최대" N번 일치합니다.
x* y+ z? 이와 맞먹습니다. x{0,} y{1,} z{0,1}.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/l{1,2}/) {   활자로 인쇄하다 "1개 이상의 하위 문자열이 있습니다.";   활자로 인쇄하다 "그리고 $string1\n에서 최대 2l입니다."; } 

출력:

Hello World에는 최소 1개에서 최대 2개의 하위 문자열이 있습니다. 
[…] 가능한 문자 일치 집합을 나타냅니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/[aeiou]+/) {   활자로 인쇄하다 "$string1에 하나 이상의 모음이 포함되어 있습니다.\n"; } 

출력:

안녕 세계  는 하나 이상의 모음을 포함합니다. 
대체 가능성을 구분합니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/(안녕 포고)/) {   활자로 인쇄하다 "$string1에는 Hello, Hi, Pogo 중 하나 이상이 포함되어 있습니다."; } 

출력:

안녕 세계  Hello, Hi 또는 Pogo 중 하나 이상을 포함합니다. 
\b 워드 클래스 문자(다음 참조)와 워드 클래스가 아닌 문자 또는 에지 사이의 0폭 경계를 일치시킵니다.

(^\w \w$ \W\w \w\W).

$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/lo\b/) {   활자로 인쇄하다 "'lo'로 끝나는 단어가 있습니다.\n"; } 

출력:

llo로 끝나는 단어가 있습니다. 
\w "_;"를 포함한 영숫자 문자를 일치시킵니다.
와 같은 [A-Za-z0-9_] ASCII로, 그리고
[\p{Alphabetic}\p{GC=Mark}\p{GC=Decimal_Number}\p{GC=Connector_Punctuation}]

유니코드로,[55] 여기서 Alphabetic 속성에는 라틴 문자보다 많은 문자가 포함되어 있으며, Decimal_Number 속성에 아랍 숫자보다 많은 숫자가 포함되어 있습니다.

$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/\w/) {   활자로 인쇄하다 "영숫자가 하나 이상 있습니다.";   활자로 인쇄하다 "$string1의 문자(A-Z, a-z, 0-9, _)\n"; } 

출력:

Hello World에 영숫자가 하나 이상 있습니다.  (A-Z, a-z, 0-9, _). 
\W "_"를 제외한 영숫자가 아닌 문자와 일치합니다.
와 같은 [^A-Za-z0-9_] ASCII로, 그리고
[^\p{Alphabetic}\p{GC=Mark}\p{GC=Decimal_Number}\p{GC=Connector_Punctuation}]

유니코드로.

$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/\W/) {   활자로 인쇄하다 "Hello와 "사이의 공간";   활자로 인쇄하다 "세계는 영숫자가 아닙니다.\n"; } 

출력:

Hello와 World 사이의 공간은 영숫자가 아닙니다. 
\s 공백 문자와 일치합니다.
ASCII는 탭, 라인 피드, 폼 피드, 캐리지 리턴 및 스페이스입니다.
유니코드에서는 끊기지 않는 공백, 다음 줄 및 가변 너비 공간(다른 것들 중에서도)과 일치합니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/\s.*\s/) {   활자로 인쇄하다 "$string1에는 두 개의 공백 문자가 있습니다. 이것은 가능합니다.";   활자로 인쇄하다 " 다른 인물로 분리되다\n"; } 

출력:

인 헬로 월드  다른 문자로 구분할 수 있는 두 개의 공백 문자가 있습니다. 
\S 빈 공간을 제외한 모든 공간과 일치합니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/\S.*\S/) {   활자로 인쇄하다 "$string1에는 두 개의 공백이 없는 문자가 있습니다.";   활자로 인쇄하다 " 다른 문자로 구분할 수 있습니다.\n"; } 

출력:

인 헬로 월드  공백이 아닌 두 개의 문자가 있으며, 이 문자는 다른 문자로 구분될 수 있습니다. 
\d 숫자와 일치합니다.
와 같은 [0-9] ASCII(아스키)로,
유니코드로, 같은 \p{Digit} 또는 \p{GC=Decimal_Number} 재산 자체는 재산과 같습니다. \p{Numeric_Type=Decimal} 소유물.
$string1 = "벽에 맥주 99병."; 한다면 ($string1 =~ m/(\d+)/) {   활자로 인쇄하다 "$1은 '$string1'\n의 첫 번째 숫자입니다."; } 

출력:

99는 '벽에 맥주 99병'의 첫 번째 숫자입니다. 
\D 숫자가 아닌 숫자와 일치합니다.
와 같은 [^0-9] ASCII 또는 \P{Digit} 유니코드로.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/\D/) {   활자로 인쇄하다 "$string1에 하나 이상의 문자가 있습니다.";   활자로 인쇄하다 " 그것은 숫자가 아닙니다.\n"; } 

출력:

Hello World에 캐릭터가 하나 이상 있습니다.  그것은 숫자가 아닙니다. 
^ 행 또는 문자열의 시작 부분과 일치합니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/^He/) {   활자로 인쇄하다 "$string1은 'He'라는 문자로 시작합니다.\n"; } 

출력:

안녕 세계  'He'라는 글자로 시작합니다. 
$ 행 또는 문자열의 끝을 일치시킵니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/rld$/) {   활자로 인쇄하다 "$string1은 행 또는 문자열입니다.";   활자로 인쇄하다 "그것은 'rld'로 끝납니다.\n"; } 

출력:

안녕 세계  'rld'로 끝나는 줄 또는 문자열입니다. 
\A 문자열의 시작 부분과 일치하지만 내부 행은 일치하지 않습니다.
$string1 = "안녕하세요\n월드\n"; 한다면 ($string1 =~ m/\AH/) {   활자로 인쇄하다 "$string1은 문자열입니다";   활자로 인쇄하다 "그것은 'H'로 시작합니다."\n"; } 

출력:

안녕하세요. 세계  'H'로 시작하는 문자열입니다. 
\z 문자열의 끝을 일치시키지만 내부 줄은 일치시키지 않습니다.[70]
$string1 = "안녕하세요\n월드\n"; 한다면 ($string1 =~ m/d\n\z/) {   활자로 인쇄하다 "$string1은 문자열입니다";   활자로 인쇄하다 'd\n'로 끝나는 거지'.\n"; } 

출력:

안녕하세요. 세계  d\n로 끝나는 문자열입니다.'. 
[^…] 괄호 안의 문자를 제외한 모든 문자를 일치시킵니다.
$string1 = "헬로 월드\n"; 한다면 ($string1 =~ m/[^abc]/) {  활자로 인쇄하다 "$string1에 " 이외의 문자가 포함되어 있습니다.";  활자로 인쇄하다 "a, b, and c.\n"; } 

출력:

안녕 세계  a, b, c 이외의 문자를 포함합니다. 

인덕션

정규 표현식은 종종 일련의 예제 문자열을 기반으로 생성("유도" 또는 "학습")될 수 있습니다. 이것은 정규 언어의 귀납법으로 알려져 있으며, 컴퓨터 학습 이론에서 문법 귀납법의 일반적인 문제의 일부입니다. 형식적으로, 정규 언어의 문자열의 예와 해당 정규 언어가 아닌 문자열의 예가 주어지면 해당 언어에 대한 문법, 즉 해당 언어를 생성하는 정규 표현식을 유도할 수 있습니다. 모든 정규 언어가 이러한 방식으로 유도될 수 있는 것은 아니지만(한계의 언어 식별 참조), 많은 언어가 유도될 수 있습니다. 예를 들어, 예제 {1, 10, 100}의 집합과 (반대되는 예제의) 음수 집합 {11, 1001, 101, 0}을 사용하여 정규식 1 ⋅0*(1 다음에 0 또는 그 이상의 0)을 유도할 수 있습니다.

참고 항목

메모들

  1. ^ Goyvaerts, Jan. "Regular Expression Tutorial - Learn How to Use Regular Expressions". Regular-Expressions.info. Archived from the original on 2016-11-01. Retrieved 2016-10-31.
  2. ^ Mitkov, Ruslan (2003). The Oxford Handbook of Computational Linguistics. Oxford University Press. p. 754. ISBN 978-0-19-927634-9. Archived from the original on 2017-02-28. Retrieved 2016-07-25.
  3. ^ Lawson, Mark V. (17 September 2003). Finite Automata. CRC Press. pp. 98–100. ISBN 978-1-58488-255-8. Archived from the original on 27 February 2017. Retrieved 25 July 2016.
  4. ^ "How a Regex Engine Works Internally". regular-expressions.info. Retrieved 24 February 2024.
  5. ^ "How Do You Actually Use Regex?". howtogeek.com. Retrieved 24 February 2024.
  6. ^ Kleene 1951.
  7. ^ Leung, Hing (16 September 2010). "Regular Languages and Finite Automata" (PDF). New Mexico State University. Archived from the original (PDF) on 5 December 2013. Retrieved 13 August 2019. The concept of regular events was introduced by Kleene via the definition of regular expressions.
  8. ^ a b 톰슨 1968.
  9. ^ a b Johnson et al. 1968.
  10. ^ Kernighan, Brian (2007-08-08). "A Regular Expressions Matcher". Beautiful Code. O'Reilly Media. pp. 1–2. ISBN 978-0-596-51004-6. Archived from the original on 2020-10-07. Retrieved 2013-05-15.
  11. ^ Ritchie, Dennis M. "An incomplete history of the QED Text Editor". Archived from the original on 1999-02-21. Retrieved 9 October 2013.
  12. ^ a b Aho & Ullman 1992, 10.11 10장 서지 노트, 589쪽.
  13. ^ Aycock 2003, p. 98.
  14. ^ Raymond, Eric S. citing Dennis Ritchie (2003). "Jargon File 4.4.7: grep". Archived from the original on 2011-06-05. Retrieved 2009-02-17.
  15. ^ "New Regular Expression Features in Tcl 8.1". Archived from the original on 2020-10-07. Retrieved 2013-10-11.
  16. ^ "Documentation: 9.3: Pattern Matching". PostgreSQL. Archived from the original on 2020-10-07. Retrieved 2013-10-12.
  17. ^ Wall, Larry (2006). "Perl Regular Expressions". perlre. Archived from the original on 2009-12-31. Retrieved 2006-10-10.
  18. ^ a b 벽 (2002)
  19. ^ "GRegex – Faster Analytics for Unstructured Text Data". grovf.com. Archived from the original on 2020-10-07. Retrieved 2019-10-22.
  20. ^ "CUDA grep". bkase.github.io. Archived from the original on 2020-10-07. Retrieved 2019-10-22.
  21. ^ a b c d Kerrisk, Michael. "grep(1) - Linux manual page". man7.org. Retrieved 31 January 2023.
  22. ^ a b Hopcroft, Motwani & Ullman (2000)
  23. ^ 사이퍼 (1998)
  24. ^ Gelade & Neven (2008, 페이지 332, Thm.4.1)
  25. ^ Gruber & Holzer (2008)
  26. ^ Gelade & Neven(2008)을 기반으로, 그 보체가 약 2의32 길이를 갖도록 약 850의 정규 표현식을 파일에서 찾을 수 있습니다.RegexComplementBlowup.png.
  27. ^ "Regular expressions for deciding divisibility". s3.boskent.com. Retrieved 2024-02-21.
  28. ^ Gischer, Jay L. (1984). (Title unknown) (Technical Report). Stanford Univ., Dept. of Comp. Sc.[title 실종]
  29. ^ Hopcroft, John E.; Motwani, Rajeev & Ullman, Jeffrey D. (2003). Introduction to Automata Theory, Languages, and Computation. Upper Saddle River, New Jersey: Addison Wesley. pp. 117–120. ISBN 978-0-201-44124-6. This property need not hold for extended regular expressions, even if they describe no larger class than regular languages; cf. p.121.
  30. ^ 코젠 (1991)[페이지 필요]
  31. ^ Redko, V.N. (1964). "On defining relations for the algebra of regular events". Ukrainskii Matematicheskii Zhurnal (in Russian). 16 (1): 120–126. Archived from the original on 2018-03-29. Retrieved 2018-03-28.
  32. ^ ISO/IEC 9945-2:1993 정보 기술 휴대용 운영 체제 인터페이스(POSIX)Part 2: 유틸리티, 연속적으로 ISO/IEC 9945-2:2002 정보 기술 휴대용 운영 체제 인터페이스(POSIX) Part 2: 시스템 인터페이스, ISO/IEC 9945-2:2003, 및 현재 ISO/IEC/IEEE 9945:2009 정보 기술 휴대용 운영 체제 인터페이스(POSIX) 기본 사양, 7호
  33. ^ Single Unix 규격(버전 2)
  34. ^ "9.3.6 BREs Matching Multiple Characters". The Open Group Base Specifications Issue 7, 2018 edition. The Open Group. 2017. Retrieved December 10, 2023.
  35. ^ Ross Cox (2009). "Regular Expression Matching: the Virtual Machine Approach". swtch.com. Digression: POSIX Submatching
  36. ^ "Perl Regular Expression Documentation". perldoc.perl.org. Archived from the original on December 31, 2009. Retrieved January 8, 2012.
  37. ^ a b "Regular Expression Syntax". Python 3.5.0 documentation. Python Software Foundation. Archived from the original on 18 July 2018. Retrieved 10 October 2015.
  38. ^ SRE: Atomic Grouping(?>...)이 지원되지 않습니다 #34627
  39. ^ a b "Essential classes: Regular Expressions: Quantifiers: Differences Among Greedy, Reluctant, and Possessive Quantifiers". The Java Tutorials. Oracle. Archived from the original on 7 October 2020. Retrieved 23 December 2016.
  40. ^ "Atomic Grouping". Regex Tutorial. Archived from the original on 7 October 2020. Retrieved 24 November 2019.
  41. ^ Cezar Câmpeanu; Kai Salomaa & Sheng Yu (Dec 2003). "A Formal Study of Practical Regular Expressions". International Journal of Foundations of Computer Science. 14 (6): 1007–1018. doi:10.1142/S012905410300214X. Archived from the original on 2015-07-04. Retrieved 2015-07-03. 정리 3(p.9)
  42. ^ "Perl Regular Expression Matching is NP-Hard". perl.plover.com. Archived from the original on 2020-10-07. Retrieved 2019-11-21.
  43. ^ Ritchie, D. M.; Thompson, K. L. (June 1970). QED Text Editor (PDF). MM-70-1373-3. Archived from the original (PDF) on 2015-02-03. Retrieved 2022-09-05. "QED 텍스트 편집기 참조 매뉴얼"로 재인쇄, MHCC-004, 머레이 힐 컴퓨팅, 벨 연구소(1972년 10월).
  44. ^ a b Wall, Larry (1994-10-18). "Perl 5: perlre.pod". GitHub.
  45. ^ Wandering Logic. "How to simulate lookaheads and lookbehinds in finite state automata?". Computer Science Stack Exchange. Archived from the original on 7 October 2020. Retrieved 24 November 2019.
  46. ^ Zakharevich, Ilya (1997-11-19). "Jumbo Regexp Patch Applied (with Minor Fix-Up Tweaks): Perl/perl5@c277df4". GitHub.
  47. ^ 콕스 (2007)
  48. ^ 로리카리 (2009)
  49. ^ "gnulib/lib/dfa.c". Archived from the original on 2021-08-18. Retrieved 2022-02-12. If the scanner detects a transition on backref, it returns a kind of "semi-success" indicating that the match will have to be verified with a backtracking matcher.
  50. ^ Kearns, Steven (August 2013). "Sublinear Matching With Finite Automata Using Reverse Suffix Scanning". arXiv:1308.3822 [cs.DS].
  51. ^ Navarro, Gonzalo (10 November 2001). "NR-grep: a fast and flexible pattern-matching tool" (PDF). Software: Practice and Experience. 31 (13): 1265–1312. doi:10.1002/spe.411. S2CID 3175806. Archived (PDF) from the original on 7 October 2020. Retrieved 21 November 2019.
  52. ^ "travisdowns/polyregex". GitHub. 5 July 2019. Archived from the original on 14 September 2020. Retrieved 21 November 2019.
  53. ^ Schmid, Markus L. (March 2019). "Regular Expressions with Backreferences: Polynomial-Time Matching Techniques". arXiv:1903.05896 [cs.FL].
  54. ^ "Vim documentation: pattern". Vimdoc.sourceforge.net. Archived from the original on 2020-10-07. Retrieved 2013-09-25.
  55. ^ a b "UTS#18 on Unicode Regular Expressions, Annex A: Character Blocks". Archived from the original on 2020-10-07. Retrieved 2010-02-05.
  56. ^ "regex(3) - Linux manual page". man7.org. Retrieved 2022-04-27.
  57. ^ "Regular expressions library - cppreference.com". en.cppreference.com. Retrieved 2022-04-27.
  58. ^ "Regular Expression Language - Quick Reference". microsoft.com. Retrieved 2024-02-20.
  59. ^ "Pattern (Java Platform SE 7 )". docs.oracle.com. Retrieved 2022-04-27.
  60. ^ "Regular expressions - JavaScript". MDN. Retrieved 2022-04-27.
  61. ^ "OCaml library: Str". v2.ocaml.org. Retrieved 2022-08-21.
  62. ^ "perlre". perldoc.perl.org. Retrieved 2023-02-04.
  63. ^ "PHP: PCRE - Manual". www.php.net. Retrieved 2023-02-04.
  64. ^ "re – Regular expression operations". docs.python.org. Retrieved 2023-02-24.
  65. ^ "Regex on crates.io". Crates.io. Archived from the original on 2022-11-29. Retrieved 2023-02-24.
  66. ^ Horowitz, Bradley (24 October 2011). "A fall sweep". Google Blog. Archived from the original on 21 October 2018. Retrieved 4 May 2019.
  67. ^ Perl 일치 작업을 지정하는 데 항상 'm' 문자가 필요한 것은 아닙니다. 예를들면, m/[^abc]/ 로 렌더링할 수도 있습니다. /[^abc]/ . 'm'은 사용자가 영역 구분 기호로 순방향 슬래시를 사용하지 않고 일치 작업을 지정하려는 경우에만 필요합니다. 때때로 "delimiter collision"을 방지하기 위해 대체 regex 구분 기호를 지정하는 것이 유용합니다. 자세한 내용은 'Wayback Machine에서 perldoc perlrecive 2009-12-31'을 참조하십시오.
  68. ^ 예를 들어, 자바 in a Nutshell, p. 213; Python Scripting for Computational Science, p. 320; 프로그래밍 PHP, p. 106 참조.
  69. ^ 모든 if 문이 TRUE 값을 반환합니다.
  70. ^ Conway, Damian (2005). "Regular Expressions, End of String". Perl Best Practices. O'Reilly. p. 240. ISBN 978-0-596-00173-5. Archived from the original on 2020-10-07. Retrieved 2017-09-10.

참고문헌

외부 링크