정규식(PCRE) Differences From Perl
여기에 설명된 차이점은 Perl 5.005와 관련이 있습니다.
- 기본적으로 공백 문자는 C 라이브러리 함수 isspace()가 인식하는 모든 문자이지만 대체 문자 유형 테이블을 사용하여 PCRE를 컴파일할 수 있습니다. 일반적으로 isspace()는 공백, 폼피드, 줄 바꿈, 캐리지 리턴, 가로 탭 및 세로 탭과 일치합니다. Perl 5는 더 이상 공백 문자 집합에 세로 탭을 포함하지 않습니다. 오랫동안 Perl 문서에 있던 \v 이스케이프는 실제로 인식되지 않았습니다. 그러나 문자 자체는 최소 5.002까지 공백으로 처리되었습니다. 5.004 및 5.005에서는 \s와 일치하지 않습니다.
- PCRE는 예측 어설션에서 반복 수량자를 허용하지 않습니다. Perl은 이를 허용하지만 여러분이 생각하는 것과 같은 의미는 아닙니다. 예를 들어, (?!a){3}는 다음 세 문자가 "a"가 아니라고 주장하지 않습니다. 다음 문자가 "a"가 아님을 세 번 주장합니다.
- 부정 예측 어설션 내에서 발생하는 캡처 하위 패턴은 계산되지만 오프셋 벡터의 항목은 설정되지 않습니다. Perl은 어설션이 일치하는 데 실패하기 전에(따라서 성공) 일치하는 패턴에서 숫자 변수를 설정합니다. 단, 부정적인 lookahead 어설션에 분기가 하나만 포함된 경우에만 가능합니다.
- 이진 0 문자는 주제 문자열에서 지원되지만 0으로 끝나는 일반 C 문자열로 전달되기 때문에 패턴 문자열에서는 허용되지 않습니다. 이스케이프 시퀀스 "\x00"은 이진 0을 나타내는 패턴에 사용할 수 있습니다.
- \l, \u, \L, \U와 같은 Perl 이스케이프 시퀀스는 지원되지 않습니다. 사실 이것들은 Perl의 일반적인 문자열 처리에 의해 구현되며 패턴 일치 엔진의 일부가 아닙니다.
- Perl \G 어설션은 단일 패턴 일치와 관련이 없으므로 지원되지 않습니다.
- 분명히 PCRE는 (?{code}) 및 (??{code}) 구성을 지원하지 않습니다. 그러나 재귀 패턴에 대한 지원이 있습니다.
- Perl 5.005_02를 작성할 때 패턴의 일부가 반복될 때 캡처된 문자열의 설정과 관련하여 이상한 점이 있습니다. 예를 들어 /^(a(b)?)+$/ 패턴에 대해 "aba"를 일치시키면 $2를 값 "b"로 설정하지만 "aabbaa"를 /^(aa(bb)?)+$/에 대해 일치시키면 $2 미설정. 그러나 패턴이 /^(aa(b(b))?)+$/로 변경되면 $2(및 $3)가 설정됩니다. Perl 5.004에서는 두 경우 모두 $2가 설정되며 PCRE 미래에 Perl이 다른 일관된 상태로 변경되면 PCRE가 그에 따라 변경될 수 있습니다. 에서도 마찬가지입니다.
- 아직 해결되지 않은 또 다른 불일치는 Perl 5.005_02에서 패턴 /^(a)?(?(1)a|b)+$/가 문자열 "a"와 일치하지만 PCRE에서는 일치하지 않는다는 것입니다. 그러나 Perl과 PCRE 모두에서 /^(a)?a/가 "a"와 일치하면 $1이 설정되지 않은 상태로 남습니다.
- PCRE는 Perl 정규 표현식 기능에 대한 몇 가지 확장을 제공합니다.
- lookbehind 어설션은 고정 길이 문자열과 일치해야 하지만 lookbehind 어설션의 각 대체 분기는 다른 길이의 문자열과 일치할 수 있습니다. Perl 5.005에서는 모두 동일한 길이를 요구합니다.
- PCRE_DOLLAR_ENDONLY가 설정되고 PCRE_MULTILINE이 설정되지 않으면 $ 메타 문자는 문자열의 맨 끝에서만 일치합니다.
- PCRE_EXTRA가 설정되면 특별한 의미가 없는 문자가 뒤에 오는 백슬래시가 오류가 발생합니다.
- PCRE_UNGREEDY가 설정되면 반복 수량자의 탐욕이 반전됩니다.