정규식(PCRE) PCRE Patterns Escape sequences

백슬래시 문자는 여러 용도로 사용됩니다. 첫째, 영숫자가 아닌 문자가 뒤에 오는 경우 해당 문자가 가질 수 있는 모든 특별한 의미를 제거합니다. 이스케이프 문자로 백슬래시를 사용하는 것은 문자 클래스 내부와 외부 모두에 적용됩니다.

예를 들어 "*" 문자를 일치시키려면 패턴에 "\*"를 작성합니다. 이는 다음 문자가 메타 문자로 해석되는지 여부에 관계없이 적용되므로 영숫자가 아닌 문자 앞에 "\"를 추가하여 해당 문자가 스스로를 나타내도록 지정하는 것이 항상 안전합니다. 특히 백슬래시를 일치시키려면 "\\"를 작성합니다.

메모: 작은따옴표와 큰따옴표로 묶인 PHP 문자열에는 백슬래시가 특별한 의미가 있습니다. 따라서 \가 정규식 \\와 일치해야 하는 경우 PHP 코드에서 "\\\\" 또는 '\\\\'를 사용해야 합니다.

패턴이 PCRE_EXTENDED 옵션으로 컴파일되면 패턴의 공백(문자 클래스 제외)과 문자 클래스 외부의 "#"과 다음 줄 바꿈 문자 사이의 문자는 무시됩니다. 이스케이프 백슬래시는 패턴의 일부로 공백 또는 "#" 문자를 포함하는 데 사용할 수 있습니다.

백슬래시를 두 번째로 사용하면 인쇄되지 않는 문자를 눈에 보이는 방식으로 패턴으로 인코딩할 수 있습니다. 패턴을 종료하는 바이너리 0을 제외하고 인쇄되지 않는 문자의 모양에는 제한이 없지만 텍스트 편집으로 패턴을 준비할 때 일반적으로 바이너리 문자보다 다음 이스케이프 시퀀스 중 하나를 사용하는 것이 더 쉽습니다. 다음을 나타냅니다.

\a
알람, 즉 BEL 문자(hex 07)
\cx
"control-x", 여기서 x는 임의의 문자입니다.
\e
escape (hex 1B)
\f
formfeed (hex 0C)
\n
newline (hex 0A)
\p{xx}
xx 속성이 있는 문자, 자세한 내용은 unicode properties 참조
\P{xx}
xx 속성이 없는 문자, 자세한 내용은 unicode properties 참조
\r
carriage return (hex 0D)
\R
line break: matches \n, \r and \r\n
\t
tab (hex 09)
\xhh
16진수 코드가 hh인 문자
\ddd
8진수 코드가 있는 문자 ddd 또는 역참조

"\cx"의 정확한 효과는 다음과 같습니다. "x"가 소문자이면 대문자로 변환됩니다. 그런 다음 문자의 비트 6(16진수 40)이 반전됩니다. 따라서 "\cz"는 16진수 1A가 되지만 "\c{"는 16진수 3B가 되고 "\c;"는 16진수 3B가 됩니다. 16진수 7B가 됩니다.

"\x" 다음에 최대 2개의 16진수를 읽습니다(문자는 대문자 또는 소문자 가능). UTF-8 mode에서는 중괄호의 내용이 16진수 문자열인 "\x{...}"가 허용됩니다. 코드 번호가 주어진 16진수 숫자인 UTF-8 문자로 해석됩니다. 원래 16진수 이스케이프 시퀀스인 \xhh는 값이 127보다 크면 2바이트 UTF-8 문자와 일치합니다.

"\0" 다음에 최대 2개의 8진수를 더 읽습니다. 두 경우 모두 두 자리 미만인 경우 존재하는 자리만 사용됩니다. 따라서 시퀀스 "\0\x\07"은 두 개의 이진 0 다음에 BEL 문자를 지정합니다. 뒤에 오는 문자가 8진수인 경우 초기 0 뒤에 두 자리를 제공해야 합니다.

백슬래시 뒤에 0이 아닌 숫자가 오는 경우 처리가 복잡합니다. 문자 클래스 외부에서 PCRE는 문자 클래스와 다음 숫자를 십진수로 읽습니다. 숫자가 10보다 작거나 표현식에 이전에 캡처한 왼쪽 괄호가 너무 많은 경우 전체 시퀀스가 ​​back reference로 사용됩니다. 이것이 어떻게 작동하는지에 대한 설명은 괄호로 묶인 하위 패턴에 대한 논의 이후에 제공됩니다.

문자 클래스 내에서 또는 10진수가 9보다 크고 캡처하는 하위 패턴이 많지 않은 경우 PCRE는 백슬래시 뒤에 오는 최대 3개의 8진수를 다시 읽고 최하위 8비트에서 단일 바이트를 생성합니다. 값. 모든 후속 숫자는 자체를 나타냅니다. 예를 들어:

\040
공백을 쓰는 또 다른 방법입니다
\40
이전 캡처 하위 패턴이 40개 미만인 경우 동일합니다.
\7
항상 역 참조입니다
\11
역 참조이거나 탭을 작성하는 다른 방법일 수 있습니다.
\011
항상 탭입니다
\0113
문자 "3"이 뒤에 오는 탭입니다.
\113
8진수 코드가 113인 문자입니다(99개 이하의 역참조가 있을 수 있으므로).
\377
전체가 1비트로 구성된 바이트입니다.
\81
역 참조이거나 이진 0 다음에 두 개의 문자 "8"과 "1"이 옵니다.

100 이상의 8진수 값은 3개 이하의 8진수를 읽을 수 없으므로 선행 0으로 시작해서는 안 됩니다.

단일 바이트 값을 정의하는 모든 시퀀스는 문자 클래스 내부와 외부 모두에서 사용할 수 있습니다. 또한 문자 클래스 내에서 시퀀스 "\b"는 백스페이스 문자(16진수 08)로 해석됩니다. 문자 클래스 외부에서는 다른 의미를 갖습니다(아래 참조).

백슬래시를 세 번째로 사용하는 것은 일반 문자 유형을 지정하는 것입니다.

\d
임의의 10진수
\D
십진수가 아닌 모든 문자
\h
모든 수평 공백 문자
\H
가로 공백 문자가 아닌 모든 문자
\s
모든 공백 문자
\S
공백 문자가 아닌 모든 문자
\v
수직 공백 문자
\V
수직 공백 문자가 아닌 모든 문자
\w
모든 "단어" 문자
\W
모든 "비단어" 문자

각 이스케이프 시퀀스 쌍은 전체 문자 집합을 두 개의 분리된 집합으로 분할합니다. 주어진 문자는 각 쌍 중 하나만 일치합니다.

"공백" 문자는 HT(9), LF(10), FF(12), CR(13) 및 공백(32)입니다. 그러나 로케일별 일치가 발생하는 경우 코드 포인트 범위가 128-255인 문자도 공백 문자로 간주될 수 있습니다(예: NBSP(A0)).

"단어" 문자는 모든 문자, 숫자 또는 밑줄 문자, 즉 Perl "단어"의 일부가 될 수 있는 모든 문자입니다. 문자와 숫자의 정의는 PCRE의 문자 테이블에 의해 제어되며 로케일별 일치가 발생하는 경우 달라질 수 있습니다. 예를 들어, "fr"(프랑스어) 로케일에서 128보다 큰 일부 문자 코드는 악센트가 있는 문자에 사용되며 \w와 일치합니다.

이러한 문자 유형 시퀀스는 문자 클래스 내부와 외부 모두에 나타날 수 있습니다. 그들은 각각 적절한 유형의 하나의 문자와 일치합니다. 현재 일치 지점이 주제 문자열의 끝에 있으면 일치할 문자가 없기 때문에 모두 실패합니다.

백슬래시를 네 번째로 사용하는 것은 특정 단순 어설션에 사용됩니다. 어설션은 제목 문자열의 문자를 사용하지 않고 일치의 특정 지점에서 충족되어야 하는 조건을 지정합니다. 더 복잡한 어설션에 대한 하위 패턴의 사용은 아래에 설명되어 있습니다. 백 슬래시 어설션은

\b
단어 경계
\B
단어 경계가 아닌
\A
제목 시작(여러 줄 모드와 무관)
\Z
제목의 끝 또는 끝의 줄 바꿈(여러 줄 모드와 무관)
\z
제목의 끝(여러 줄 모드와 무관)
\G
제목에서 첫 번째 일치 위치

이러한 어설션은 문자 클래스에 나타나지 않을 수 있습니다(그러나 "\b"는 문자 클래스 내에서 다른 의미, 즉 백스페이스 문자를 가집니다).

단어 경계는 현재 문자와 이전 문자가 모두 \w 또는 \W와 일치하지 않는(즉, 하나는 \w와 일치하고 다른 하나는 \W와 일치) 대상 문자열의 위치이거나, 다음과 같은 경우 문자열의 시작 또는 끝 첫 번째 또는 마지막 문자는 각각 \w와 일치합니다.

\A, \Z, \z 어설션은 어떤 옵션이 설정되든 주제 문자열의 맨 처음과 끝에서만 일치한다는 점에서 기존의 곡절 및 달러(anchors에 설명됨)와 다릅니다. PCRE_MULTILINE 또는 PCRE_DOLLAR_ENDONLY 옵션의 영향을 받지 않습니다. \Z\z의 차이점은 \Z는 문자열의 마지막 문자인 줄 바꿈 앞과 문자열 끝에서 일치하는 반면 \z는 끝에서만 일치한다는 것입니다.

\G 어설션은 현재 일치 위치가 preg_match()offset 인수에 지정된 대로 일치 시작점에 있을 때만 참입니다. offset 값이 0이 아닌 경우 \A와 다릅니다.

\Q\E는 패턴에서 regexp 메타 문자를 무시하는 데 사용할 수 있습니다. 예: \w+\Q.$.\E$는 하나 이상의 단어 문자와 일치하고 그 뒤에 리터럴 .$.가 옵니다. 그리고 문자열 끝에 고정됩니다. 이것은 구분 기호의 동작을 변경하지 않습니다. 예를 들어 #\Q#\E#$ 패턴은 유효하지 않습니다. 왜냐하면 두 번째 #은 패턴의 끝을 표시하고 \E#은 잘못된 수정자로 해석되기 때문입니다.

\K는 경기 시작을 재설정하는 데 사용할 수 있습니다. 예를 들어 foo\Kbar 패턴은 "foobar"와 일치하지만 "bar"와 일치한다고 보고합니다. \K의 사용은 캡처된 하위 문자열의 설정을 방해하지 않습니다. 예를 들어 (foo)\Kbar 패턴이 "foobar"와 일치할 때 첫 번째 부분 문자열은 여전히 ​​"foo"로 설정됩니다.