Perl 호환 정규식
Perl Compatible Regular Expressions원본 작성자 | 필립 헤이즐 |
---|---|
안정적 해제 | PCRE2 10.38 및 PCRE 8.45 / 2021년 6월 15일;[1] 전 |
리포지토리 | |
기록 위치 | C |
운영 체제 | 크로스 플랫폼 |
유형 | 패턴 매칭 도서관 |
면허증 | BSD |
웹사이트 | www.pcre.org |
Perl 호환 정규 표현식(PCRE)은 Perl 프로그래밍 언어의 기능에서 영감을 받아 정규 표현 엔진을 구현하는 C로 작성된 라이브러리다.필립 헤이즐은 1997년 여름 PCRE를 쓰기 시작했다.[2]PCRE의 구문은 POSIX 정규 표현식 맛의 하나(BRE, ERE)[3]와 다른 많은 정규 표현 라이브러리의 구문보다 훨씬 강력하고 유연하다.
PCRE는 원래 Perl과의 특징적 동등성을 목표로 했지만, 두 구현은 완전히 동등하지는 않다.PCRE 7.x와 Perl 5.9.x 단계 동안 두 프로젝트는 양방향으로 기능이 포팅되는 등 개발을 조정했다.[4]
2015년에는 수정된 프로그래밍 인터페이스(API)와 함께 PCRE 포크가 출시되었다.현재 PCRE1 (8.xx 시리즈)이라고 불리는 원래의 소프트웨어는 버그를 수정했지만, 더 이상의 개발은 없었다.지금은(2020년) 구식이라고 여겨지고 있으며, 현재 8.45 발매는 마지막이 될 것 같다.새로운 PCRE2 코드(10.xx 시리즈)는 여러 가지 연장과 코딩 개선이 이루어졌으며 개발이 이루어지는 곳이다.
Apache 및 Nginx HTTP 서버, PHP 및 R 스크립팅 언어와 같은 다수의 저명한 오픈 소스 프로그램도 PCRE 라이브러리를 통합한다. 라이브러리가 BSD 사용권이기 때문에 독점 소프트웨어도 이와 같이 할 수 있다.Perl 5.10을 기준으로 PCRE는 또한 Perl의 기본 정규식 엔진의 대체품으로 사용할 수 있다.re::engine::PCRE
모듈
도서관은 Unix, Windows 및 몇 가지 다른 환경에 구축될 수 있다.PCRE2는 POSIX C 래퍼,[Note 1] 여러 테스트 프로그램 및 유틸리티 프로그램과 함께 배포된다.pcre2grep
도서관과 나란히 지어졌다.
특징들
적시 컴파일러 지원
이 선택적 기능은 PCRE2 라이브러리가 빌드될 때 활성화될 경우 사용할 수 있다.통화 프로그램이 반복적으로 실행되는 호환 패턴과 함께 기능을 이용할 때(예를 들어) 큰 성능 편익이 가능하다.Just-in-time 컴파일러 지원은 Zoltan Herczeg에 의해 작성되었으며 POSIX 포장지에서는 다루지 않는다.
유연한 메모리 관리
역추적을 위한 시스템 스택의 사용은 PCRE1에서 문제가 될 수 있으며, 그 때문에 PCRE2에서 구현의 이 기능이 변경되었다.힙은 현재 이러한 목적으로 사용되고 있으며, 총량은 제한될 수 있다.PCRE1과 함께 정기적으로 올라온 스택 오버플로 문제는 더 이상 릴리즈 10.30(2017년)부터 PCRE2가 문제가 아니다.
일관된 이스케이프 규칙
Perl과 마찬가지로 PCRE2에도 일관된 이스케이프 규칙이 있다. 알파벳이 아닌 문자는 다음 문자에 접두사를 붙여 문자 값을 의미하는 것으로 이스케이프할 수 있다.\
캐릭터 앞에 (뒤로)백슬래시가 선행하는 영숫자 문자는 일반적으로 특별한 의미를 부여한다.시퀀스가 특별하다고 정의되지 않은 경우 오류가 발생한다.이는 경고 모드(PCRE2에는 경고 모드가 없는 경우)에만 오류를 발생시키는 Perl과는 다르다.기본 POSIX 정규식에서 때때로 백슬래시가 비알파-숫자(예:\.
)), 그리고 때때로 그들은 특별한 특징(예:\(\)
).
확장 문자 클래스
긴 POSIX 이름 외에 단문자 문자 클래스가 지원된다.예를 들어,\d
임의의 숫자와 정확히 일치한다.[[:digit:]]
POSIX 정규 표현식일 것이다.
미니멀 매칭(A.K.A.)"영원한")
A ?
가장 짧은 일치를 사용해야 함을 나타내기 위해 반복 계량기 뒤에 배치할 수 있다.기본값은 가장 긴 경기를 먼저 시도하고 짧은 경기를 통해 역추적(예:a.*?b
'abababab'의 "ab"과 일치하는 경우,a.*b
전체 끈과 일치할 겁니다
유니코드 문자 속성
유니코드는 각 문자에 대해 몇 가지 속성을 정의한다.PCRE2의 패턴은 다음과 같은 속성과 일치할 수 있다.\p{Ps}.*?\p{Pe}
"개방형 구두점"으로 시작하는 문자열과 다음과 같은 "밀착형 구두점"으로 끝나는 문자열[abc]
. 컴파일 옵션 PCRE2_UCP가 설정된 경우 특정 "정상" 메타캐랙터의 일치는 유니코드 속성에 의해 구동될 수 있다.다음을 통해 패턴에 대한 옵션을 설정할 수 있다.(*UCP)
문양의 시초에이 옵션은 다음과 같은 메타카락터의 동작을 변경한다.\B
,\b
,\D
,\d
,\S
,\s
,\W
,\w
, 및 일부 POSIX 문자 클래스.예를 들어, 일치하는 문자 집합:\w
(단어 문자)는 유니코드 속성에 의해 정의된 문자와 악센트 문자를 포함하도록 확장된다.이러한 일치는 일반(ASCII 전용) 비 UCP 대안보다 느리다.UCP 옵션은 유니코드 지원을 포함하도록 라이브러리를 구축해야 한다는 점에 유의하십시오(PCRE2의 경우 기본값임).PCRE1의 초기 버전은 ASCII 코드만 지원했다.이후 UTF-8 지원이 추가됐다.UTF-16에 대한 지원은 버전 8.30에서 추가되었고 UTF-32에 대한 지원은 버전 8.32에서 추가되었다. PCRE2는 항상 3개의 UTF 인코딩을 모두 지원해왔다.
멀티라인 매칭
^
그리고$
설정된 옵션에 따라 문자열의 시작과 끝 또는 문자열 내의 각 "라인"의 시작과 끝에서만 일치시킬 수 있다.
줄 바꿈 옵션
PCRE를 컴파일하면 뉴라인 디폴트가 선택된다.PCRE가 감지하는 위치에 영향을 미치는 뉴라인/라인 브레이크^
시작과 시작에 선을 긋다$
끝(다중 라인 모드에서)과 일치하는 점(다중 라인 모드의 경우, dotall 옵션이 없는 경우)(?s)
설정됨).또한 PCRE 일치 절차(버전 7.0 이후)에도 영향을 미친다. 연결되지 않은 패턴이 뉴라인 시퀀스 시작 시 PCRE가 전체 뉴라인 시퀀스를 통과하지 못한 후 다시 매치를 시도한다.뉴라인 옵션 대안에 CRLF가 유효한 줄 바꿈 중 하나로 포함되어 있는 경우, 다음 항목을 건너뛰지 않는다.\n
CRLF에서 패턴에 특정 패턴이 포함된 경우\r
또는\n
참고 자료(버전 7.3 이후)8.10 버전 이후 메타카박터\N
줄 바꿈 문자 이외의 문자와 항상 일치한다.와 같은 행동을 한다..
dotall 옵션이 ka일 때(?s)
효력이 없다.
뉴라인 옵션은 PCRE를 컴파일할 때와 실행할 때 외부 옵션으로 변경할 수 있다.PCRE를 사용하는 일부 애플리케이션은 사용자에게 외부 옵션을 통해 이 설정을 적용할 수 있는 수단을 제공한다.따라서 뉴라인 옵션은 다음 중 하나를 사용하여 패턴 시작 시에도 명시될 수 있다.
(*LF)
뉴라인은 라인피드 문자다.해당 라인브레이크는 다음 항목과 일치할 수 있다.\n
.(*CR)
뉴라인(Newline)은 마차 반환점이다.해당 라인브레이크는 다음 항목과 일치할 수 있다.\r
.(*CRLF)
뉴라인/라인브레이크는 캐리지 리턴에 이어 라인피드가 이어진다.해당 라인브레이크는 다음 항목과 일치할 수 있다.\r\n
.(*ANYCRLF)
상기 데이터에서 마주친 어느 하나라도 뉴라인 처리를 촉발할 것이다.해당 라인브레이크는 다음 항목과 일치할 수 있다.(?:\r\n? \n)
또는 을 가지고\R
백슬래시-R과 일치하는 구성 및 옵션은 아래를 참조하십시오.(*ANY)
위의 더하기 특수 유니코드 라인 브레이크 중 하나.
UTF-8 모드가 아닌 경우, 해당 라인브레이크는 다음 항목과 일치시킬 수 있다.(?:\r\n? \n \x0B \f \x85)
[Note 2] 또는\R
.
UTF-8 모드에서는 2개의 추가 문자가 다음 줄 바꿈으로 인식된다.(*ANY)
:
- LS(라인 구분 기호, U+2028),
- PS(문단 구분자, U+2029).
윈도우즈의 경우 유니코드가 아닌 데이터에서ANY
줄 바꿈 문자는 다른 의미를 가지고 있다.
예를 들어,\x85
수평 줄임표와 일치할 수 있으며, 만약 다음과 같은 경우에ANY
뉴라인은 유효하다. 뉴라인 처리를 촉발할 것이다.
백슬래시-R과 일치하는 구성 및 옵션에 대해서는 아래를 참조하십시오.
백슬래시-R 옵션
PCRE를 컴파일할 때 일치하는 항목에 대해 기본값이 선택됨\R
. 기본값은 ANYCRLF에 해당하는 줄 바꿈 또는 ANY에 해당하는 줄 바꿈과 일치할 수 있다.필요한 경우 다음을 포함하여 기본값을 재정의할 수 있음(*BSR_UNICODE)
또는(*BSR_ANYCRLF)
패턴이 시작될 때제공 시(*BSR..)
옵션, 또한(*newline)
옵션(예:(*BSR_UNICODE)(*ANY)rest-of-pattern
. 백슬래시-R 옵션은 패턴이 컴파일될 때 PCRE2를 호출하는 응용 프로그램에 의해 외부 옵션으로 변경될 수 있다.
패턴 옵션의 시작
라인브레이크 옵션(예:(*LF)
위에 문서화, 백슬래시-R 옵션(예:(*BSR_ANYCRLF)
위에 문서화됨; 유니코드 문자 속성 옵션(*UCP)
위에 문서화된(*UTF8)
다음과 같이 문서화된 옵션: PCRE2 라이브러리가 UTF 지원으로 컴파일된 경우(*UTF)
UTF-8, UTF-16 또는 UTF-32 모드를 호출하는 외부 옵션을 설정하는 대신 패턴 시작 시 옵션.
역참조
패턴은 이전 경기의 결과를 다시 나타낼 수 있다.예를 들어,(a b)c\1
"aca" 또는 "bcb"와 일치하며, "acb"와 같이 일치하지 않는다.
명명된 하위 패턴
하위 패턴(대략적으로 괄호로 둘러싸인, 다음과 같은 것)(...)
)는 선행자를 포함하여 명명할 수 있다.?P<name>
앞 괄호 뒤에명명된 서브패턴은 PCRE가 파이썬 정규식에서 채택한 기능이다.
이 기능은 이후 Perl에 의해 채택되었으므로, 현재 명명된 그룹도 다음을 사용하여 정의할 수 있다.(?<name>...)
또는(?'name'...)
게다가(?P<name>...)
. 명명된 그룹은 다음과 같이 역참조할 수 있다.(?P=name)
(피톤 구문) 또는\k'name'
(Perl 구문).
서브루틴
역참조에서는 이전에 서브패턴과 일치하는 피사체의 해당 부분을 참조하는 메커니즘을 제공하는 반면, 서브루틴은 이전에 정의된 서브패턴을 재사용하는 메커니즘을 제공한다.케이스 독립성과 같은 서브패턴의 옵션은 서브패턴이 정의될 때 고정된다. (a.c)(?1)
"aacabc" 또는 "aacadc"와 일치하는 반면, 백레퍼런스(back reference)는(a.c)\1
비록 두 가지 모두 "아카악"이나 "아카악"과 일치할 것이지만, 그렇지 않을 것이다.PCRE는 또한 서브루틴을 위한 비 Perl Oniguruma 구조를 지원한다.다음을 사용하여 지정됨\g<subpat-number>
또는\g<subpat-name>
.
원자 그룹화
원자 그룹화는 패턴에서 역추적을 방지하는 방법이다.예를 들어,a++bc
가능한 한 많은 "a"와 일치할 것이며, "a"를 줄이려고 절대 물러서지 않을 것이다.
주의력 및 주의력
주장 | 뒤돌아보다; 회고하다 | 앞을 내다보다, 장래 일을 생각하다, 장래에 대비하다 |
---|---|---|
긍정적인 | (?<=패턴) | (?=패턴) |
네거티브 | (?<!패턴) | (?패턴) |
뒤보기 및 앞보기 주장 펄 정규 표현으로 |
패턴은 일치하는 텍스트(영폭 주장)를 사용하지 않고 이전 텍스트 또는 후속 텍스트가 패턴을 포함한다고 주장할 수 있다.예를 들어 /\w+(?=\t)
/ 탭 자체를 포함하지 않고 단어 뒤에 탭이 있는 단어와 일치한다.
(Perl과 달리) 지점마다 고정 길이가 다를 수 있지만, 뒤돌아보는 주장은 길이가 불확실할 수 없다.
\K
패턴으로 현재 전체 일치의 시작을 재설정할 수 있다.이것은 경기의 버려진 부분(앞서는 부분)이 있기 때문에 뒤돌아보는 주장에 대한 유연한 대안적 접근법을 제공한다.\K
)는 길이를 고정할 필요가 없다.
제로 너비 주장을 위한 이스케이프 시퀀스
예시\b
다음과 유사한 0 너비의 "단어 경계"를 일치시키는 경우(?<=\W)(?=\w) (?<=\w)(?=\W) ^ $
.
평.
코멘트는 로 시작된다.(?#
그리고 다음 닫는 괄호에서 끝난다.
재귀 패턴
패턴은 반복적으로 또는 어떤 하위 패턴을 다시 나타낼 수 있다.예를 들어, 패턴\((a* (?R))*\)
균형 잡힌 괄호와 "a"의 어떤 조합도 일치한다.
일반 콜아웃
PCRE 표현식은 포함할 수 있음(?Cn)
, 여기서 n은 약간의 숫자다.이는 PCRE API를 통해 외부 사용자 정의 함수를 호출하며 패턴에 임의 코드를 내장하는 데 사용할 수 있다.
펄과의 차이
![]() | 이 섹션은 갱신되어야 한다.주어진 이유는 다음과 같다: 아래에 제시된 참조는 Perl 5.26을 참조한다.(2020년 9월) |
PCRE2와 Perl(Perl 5.9.4 기준)의 차이는 다음을 포함하지만 이에 국한되지는 않는다.[5]
릴리스 10.30까지 재귀 일치사항은 PCRE에서는 원자성, Perl에서는 비원자성 일치였다.
라는 뜻이었다."<<!>!>!>><>>!>!>!>" =~ /^(<(?:[^<>]+ (?3) (?1))*>)()(!>!>!>)$/
Perl에서는 일치하지만 10.30 릴리즈까지는 PCRE2에서는 일치하지 않는다.
에서 파생되는 캡처 버퍼 값?
다른 정량화된 캡처 버퍼에 중첩된 경우 정량화자(1회 또는 0회 일치)
인펄"aba" =~ /^(a(b)?)+$/;
결국에 이르게 될 것이다.$1
"a" 포함$2
재중undef
, 그러나 PCRE에서는 다음과 같은 결과를 가져올 것이다.$2
"b" 포함.
PCRE는 명명된 캡처 버퍼에 숫자 이름을 부여할 수 있도록 허용하며, Perl은 이름이 베어워드의 규칙을 따르도록 요구한다.
라는 뜻이다.\g{}
Perl에서는 명확하지 않지만 PCRE에서는 잠재적으로 모호하다.
이는 더 이상 그룹명이 숫자로 시작하는 것을 허용하지 않는 PCRE 8.34(2013-12-15년 출시) 이후 더 이상 차이가 아니다.[6]
PCRE를 사용하면 다른 길이에서 뒤집을 수 있다.
뒤돌아보는 주장 안에서 PCRE와 Perl 모두 고정 길이 패턴을 요구한다.
즉, PCRE와 Perl 모두 가변 길이 패턴을 허용하지 않는다.
그러나, Perl은 뒤돌아 보이는 주장들의 모든 대체 분기는 서로 길이가 같도록 요구하는 반면, PCRE는 각 분기의 길이가 여전히 고정되어 있는 한 그러한 대체 분기는 서로 다른 길이를 가질 수 있도록 허용한다.
PCRE가 특정 "실험적" Perl 구성을 지원하지 않음
예를 들어(??{...})
(귀가가 패턴의 일부로 평가되는 콜백) 또는(?{})
비록 후자를 에뮬레이션할 수 있지만, 다음 것을 에뮬레이션할 수 있다.(?Cn)
.
Perl 5.9.x 시리즈에 추가된 재귀 제어 동사도 지원되지 않는다.
실험 역추적 제어 동사(Perl 5.10에 추가)에 대한 지원은 버전 7.3 이후 PCRE에서 이용할 수 있다.
그들은 그렇다.(*FAIL)
,(*F)
,(*PRUNE)
,(*SKIP)
,(*THEN)
,(*COMMIT)
그리고(*ACCEPT)
.
Perl이 역추적 제어 동사와 함께 상응하는 인수의 사용은 일반적으로 지원되지 않는다.
그러나 버전 8.10 이후 PCRE는 지정된 인수를 사용하여 다음과 같은 동사를 지원한다는 점에 유의하십시오.(*MARK:markName)
,(*SKIP:markName)
,(*PRUNE:markName)
그리고(*THEN:markName)
.
버전 10.32 PCRE2가 지원되는 이후(*ACCEPT:markName)
,(*FAIL:markName)
그리고(*COMMIT:markName)
.
PCRE와 Perl은 잘못된 구성에 대한 내성이 약간 다르다.
Perl은 에서 정량자를 허용한다.(?!...)
무의미하지만 무해한 구성(비효율적임); PCRE는 8.13 이전 버전에서 오류를 발생시킨다.
PCRE는 재귀 깊이에 대한 엄격한 제한이 있지만 Perl은 그렇지 않다.
기본 빌드 옵션 사용"bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" =~ /.X(.+)+X/
제한 때문에 일치하지 못하지만 Perl이 정확하게 일치할 것이다.
Perl은 재귀에 힙을 사용하며 재귀 깊이에 대한 하드 제한이 없는 반면, PCRE2는 호출 애플리케이션에 의해 위아래로 조정할 수 있는 컴파일 시간 기본 제한이 있다.
위의 포인트를 제외하고 PCRE는 Perl "에서 시험을 통과할 수 있다.t/op/re_tests
" file, Perl의 정규식 엔진에 대한 주요 구문 수준 회귀 테스트의 하나.
참고 및 참조
메모들
참조
- ^ /pub/pcre/: https://ftp.pcre.org/pub/pcre/의 색인
- ^ Exim과 PCRE: Philip Hazel에 의해 어떻게 무료 소프트웨어가 내 삶을 납치했는가 (1911-12) (페이지 7: https://www.ukuug.org/events/winter99/proc/PH.ps)
PCRE는 어떤가?
- 1997년 여름 FTP 사이트에 게시.
- 사람들은 그것을 발견했고, 메일링 리스트를 작성했다.
- 개선의 요령이 있었다.
- ^
- 정규식 - POSIX 표준(Google 검색):https://www.google.com/search?num=100&q=%22Regular+Expression%22%7C%22Regular+Expressions%22%7C%22RegEx%22%7C%22RegExp%22+site%3Apubs.opengroup.org+inurl%3Aonlinepubs%2F9699919799+-intitle%3A%22Index+of+%2Fonlinepubs%22+-inurl%3Aidx+-inurl%3Acontents.html+-inurl%3Atoc.html+-inurl%3A9699919799.orig+-inurl%3A2008edition+-inurl%3A2013edition+-inur나는%3A2016edition+-inurl%3A2018edition
- 유틸리티 § 패턴 매칭 표기법: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#tag_18_13
- 기본 정의 § 기본 정규식: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/V1_chap09.html#tag_09_03
- 근거 § 정규식: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/xrat/V4_xbd_chap09.html#tag_21_09
- ^ PCRE2 - Cambridge University of Cambridge: https://pcre.org/pcre2.txt
- ^ Philip Hazel의 PCRE2와 Perl(2019-07-13)의 차이점: https://www.pcre.org/current/doc/html/pcre2compat.html
- ^ PCRE 체인지로그(https://www.pcre.org/original/changelog.txt))를 인용하면 "Perl은 더 이상 그룹 이름이 숫자로 시작하는 것을 허용하지 않기 때문에 PCRE에서도 이런 변화를 만들었다"고 말했다.
- ^ ChangeLog for PCRE2: https://www.pcre.org/changelog.txt
참고 항목
외부 링크
- 공식 웹사이트
- PCRE - 개발 메일 목록: https://groups.google.com/g/pcre2-dev
- PCRE - 버그 트래커: https://github.com/PhilipHazel/pcre2/issues
- 정규식을 사용한 패턴 매칭(2010-03-02) 닉 맥클라렌, 필립 헤이즐: https://www-uxsup.csx.cam.ac.uk/courses/moved.REs/paper.pdf
- pcre 8.43(2019-04) - Windows Cygwin x86-64: https://www-uxsup.csx.cam.ac.uk/pub/windows/cygwin/x86_64/release/pcre/