정규식(PCRE) Differences From Perl

여기에 설명된 차이점은 Perl 5.005와 관련이 있습니다.

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