PCRE (펄 호환 정규표현식) 상세
정규표현식 상세
소개
아래 설명은 PCRE가 지원하는 정규표현식의 문법과 의미입니다. 정규표현식은 펄 문서 및 많은 책들에 설명이 있으며, 그 중 일부에는 풍부한 예제를 가지고 있습니다. O'Reilly에서 출판한 Jeffrey Friedl의 "Mastering Regular Expressions"(ISBN 1-56592-257-3)는 예제들을 매우 자세하게 다루고 있습니다. 여기의 설명은 레퍼런스 문서에 따릅니다.
정규표현식은 주어진 문자열에 대하여 왼쪽에서 오른쪽으로 매치하는 패턴입니다. 문자열은 패턴으로 준비하고, 목표에서 대응하는 문자열에 매치합니다. 간단한 예로, 패턴 The quick brown fox는 목표 문자열의 동일한 부분에 매치합니다.
메타 문자
정규표현식이 강력한 이유는 패턴에 선택과 반복을 포함할 수 있다는 점입니다. 이는 특별한 방법으로 해석하는 메타 문자를 사용하여 패턴에 넣습니다.
메타 문자는 두가지 종류가 존재합니다: 대괄호 안을 제외하고 패턴의 어디에서라도 작동하는 종류와, 대괄호 안에서만 작동하는 종류입니다. 다음은 대괄호 밖에서 사용하는 메타 문자들입니다.
- \
- 여러가지로 사용하는 일반적인 회피 문자
- ^
- 목표의 처음 (멀티라인 모드에서는 줄의 처음)
- $
- 목표의 마지막 (멀티라인 모드에서는 줄의 끝)
- .
- (기본값으로) 줄바꿈을 제외한 아무 문자
- [
- 클래스 정의 시작 문자
- ]
- 클래스 정의 끝 문자
- |
- 선택 브랜치 시작
- (
- 서브패턴 시작
- )
- 서브패턴 끝
- ?
- ( 의미 확장, 또는 0회나 1회, 또는 수량어 minimizer
- *
- 0회 이상의 횟수
- +
- 1회 이상의 횟수
- {
- 최소/최대 횟수 시작
- }
- 최소/최대 횟수 끝
대괄호 안쪽의 패턴은 "문자 클래스"라고 부릅니다. 다음은 문자 클래스에서 사용하는 메타 문자들입니다:
- \
- 일반적인 회피 문자
- ^
- 처음 문자로 올 때, 부정 클래스로 설정
- -
- 문자 범위 지정
- ]
- 문자 클래스 종료
다음 섹션은 각 메타 문자의 사용을 설명합니다.
백슬래시
백슬래시 문자는 여러가지 사용법을 가집니다. 먼저, 뒤에 영숫자가 아닌 문자가 붙는다면, 그 문자가 가지고 있는 특별한 의미가 사라집니다. 이러한 회피 문자로 백슬래시를 사용하는 것은 문자 클래스 안과 밖 양쪽에 모두 적용됩니다.
예를 들어, "*" 문자를 매치하길 원한다면, 패턴에는 "\*"로 써야합니다. 이는 따라오는 문자가 메타 문자이던 아니던간에 관계 없이 적용하기 떄문에, 영숫자가 아닌 문자에 그 자체를 사용하기 위해 "\"를 붙이는 것이 항상 안전합니다. 특히, 백슬래시를 매치하고자 한다면, "\\"로 써야합니다.
Note: 따옴표로 묶은 PHP strings에서 백슬래시는 특별한 의미를 가집니다. 정규표현식에서 \를 매치하려면 \\이므로, PHP 코드에서는 "\\\\"나 '\\\\'로 사용해야 합니다.
패턴에 PCRE_EXTENDED 옵션을 사용하면, 패턴에 존재하는 (문자 클래스 안이 아닌) 공백, 그리고 문자 클래스 밖의 "#"사이의 문자와 바로 뒤의 줄바꿈 문자를 무시합니다. 회피하는 백슬래시를 공백이나 "#"문자를 패턴에 넣기 위해 사용할 수 있습니다.
백슬래시의 두번째 사용법은 패턴에서 출력할 수 없는 문자를 보여지게 인코딩하는 방법을 제공합니다. 바이너리 제로가 패턴 종료를 의미하는걸 제외하면, 출력할 수 없는 문자가 나타나는 제한은 존재하지 않습니다. 그러나 패턴을 텍스트 편집으로 준비할 때는, 다음의 회피 시퀀스를 사용하는 편이 바이너리 문자를 직접 표현하는 것보다 간편합니다:
- \a
- 알람, BEL 문자(hex 07)
- \cx
- "control-x", x는 임의의 문자
- \e
- 이스케이프 (hex 1B)
- \f
- 폼피드 (hex 0C)
- \n
- 줄바꿈 (hex 0A)
- \r
- 캐리지 리턴 (hex 0D)
- \t
- 탭 (hex 09)
- \xhh
- 16진 코드 hh 문자
- \ddd
- 8진 코드 ddd 문자, 혹은 역참조
"\cx"의 효과는 다음과 같이 계산합니다: "x"가 소문자라면, 대문자로 변환합니다. 그 후, 문자의 6번째 비트(hex 40)가 뒤집어집니다. 즉 "\cz"은 hex 1A가 되고, "\c{"은 hex 3B, 그리고 "\c;"은 hex 7B가 됩니다.
"\x" 뒤에, 두개의 16진 숫자를 읽습니다. (대소문자는 구별하지 않습니다) UTF-8 모드에서는, "\x{...}"이 허용됩니다. 중괄호 안에는 16진수로 나타나는 문자열이 들어갑니다. 주어진 16진 문자열에 해당하는 UTF-8 문자로 해석합니다. 원래의 16진 회피 시퀀스 \xhh는 127 이상일 경우에 2바이트 UTF-8 문자로 취급합니다.
"\0"은 다음의 두자리의 8진수를 읽습니다. 양쪽 모두, 두자리가 되지 않을 경우, 그 표현을 그대로 사용합니다. 즉 "\0\x\07" 시퀀스는 두개의 바이너리 제로에 이어지는 BEL 문자를 정의합니다. 바로 뒤에 8진수로 인식되는 문자가 이어질 경우에는 처음의 제로 뒤에 두자리 수를 써야한다는 것을 잊지 마십시오.
백슬래시 뒤에 0이 아닌 수가 올 경우에 혼동할 수 있습니다. 문자 클래스 밖에서, PCRE는 그것과 따라오는 수를 10진수로 읽습니다. 수가 10보다 작거나, 표현식에서 수 이상의 묶음을 잡아냈다면, 이 시퀀스는 역참조가 됩니다. 이 작동에 관해서는 아래에, 묶음 서브패턴에 설명이 있습니다.
문자 클래스 안이나, 10진수 9 이상이 없고 서브패턴이 그만큼 존재하지 않을 경우, PCRE는 백슬래시 뒤의 세자리 8진수로 다시 읽어들여, 해당하는 8비트 값으로 하나의 바이트를 생성합니다. 어떠한 수라도 사용할 수 있습니다. 예를 들면:
- \040
- 스페이스의 다른 표현 방법
- \40
- 40개 미만의 서브패턴을 검출하였을때, 동일한 의미
- \7
- 항상 역참조
- \11
- 역참조, 혹은 탭의 다른 표현 방법
- \011
- 항상 탭
- \0113
- 탭 뒤에 문자 "3"
- \113
- 8진 코드 113 문자 (역참조는 99까지입니다)
- \377
- 1비트만을 제외한 바이트
- \81
- 역참조이거나 "8"과 "1"의 두 문자가 붙는 바이너리 제로
100이상의 8진 값은 앞에 제로가 붙지 않아야만 합니다. 세자리를 넘어가는 8진 값은 읽지 않습니다.
하나의 바이트값을 정의하는 모든 시퀀스는 문자 클래스 내외, 어디에서도 사용할 수 있습니다. 추가로, 문자 클래스 안에서 "\b" 시퀀스는 백스페이스 문자(hex 08)로 해석합니다. 문자 클래스 밖에서는 다른 의미를 가집니다. (아래를 참고)
백슬래시의 세번째 사용법은 일반적인 문자 타입의 지정입니다:
- \d
- 임의의 10진 숫자
- \D
- 10진 숫자가 아닌 임의의 문자
- \h
- 수평 공백 문자 (PHP 5.2.4부터)
- \H
- 수평 공백 문자를 제외한 모든 문자 (PHP 5.2.4부터)
- \s
- 모든 공백 문자
- \S
- 공백이 아닌 모든 문자
- \v
- 수직 공백 문자 (PHP 5.2.4부터)
- \V
- 수직 공백 문자를 제외한 모든 문자 (PHP 5.2.4부터)
- \w
- 모든 "word" 문자
- \W
- 모든 "non-word" 문자
각 회피 시퀀스 조합은 완전한 문자 세트를 두개의 개별 세트로 분리합니다. 주어진 문자는 각 조합의 한쪽에만 매치합니다.
"word" 문자는 어떠한 문자나 숫자, 혹은 언더스코어(_)입니다. 즉, 펄의 "word"에 해당하는 어떠한 문자입니다. 문자와 숫자의 정의는 PCRE의 문자 테이블이 제어하고, 로케일 특정 매칭이 존재할 경우에는 다양할 수 있습니다. 예를 들어, "fr"(프랑스어) 로케일에서는, 128 이상의 몇몇 코드를 엑센트 문자를 나타내는데 사용하며, 이들은 \w에 매치합니다.
문자형 시퀀스는 문자 클래스 안과 밖에서 모두 사용할 수 있습니다. 각각 해당하는 형의 한 문자에 매치합니다. 현재 매칭 위치가 목표 문자열의 마지막이라면, 전부 실패하고, 어떠한 문자도 매치하지 않습니다.
백슬래시의 네번째 사용법은 간단한 단정입니다. 단정은 조건이 목표 문자열에서 다른 부분에 매치하지 않고, 특정한 위치에만 매치하도록 지정합니다. 복잡한 단정을 위한 서브패턴의 사용법은 아래에 설명이 있습니다. 백슬래시 단정은 다음과 같습니다.
- \b
- word 경계
- \B
- word 경계가 아님
- \A
- 목표의 처음 (멀티라인 모드와 무관)
- \Z
- 목표의 마지막이나 마지막에서 줄바꿈 (멀티라인 모드와 무관)
- \z
- 목표의 마지막 (멀티라인 모드와 무관)
- \G
- 주제어의 처음 매칭 위치
단정은 문자 클래스 안에서 사용할 수 없습니다. ("\b"가 문자 클래스 안에서는 백스페이스 문자를 나타내는 점에 주의하십시오)
word 경계는 현재 문자와 이전 문자가 둘 다 \w에 매치하지 않거나 둘 다 \W에 매치하지 않는 (즉, 하나는 \w에 매치하고 다른 하나는 \W에 매치) 목표 문자열의 위치이거나, 처음이나 마지막 문자가 \w에 매치할 경우는 문자열의 처음이나 마지막입니다.
\A, \Z, \z 단정은 전통적인 곡절과 달러와는 달리 옵션과 관계 없이 목표 문자열의 가장 처음이나 가장 마지막에만 매치합니다. 이들은 PCRE_MULTILINE이나 PCRE_DOLLAR_ENDONLU 옵션에 영향을 받지 않습니다. \Z와 \z의 차이는, \Z가 문자열의 마지막뿐만 아니라 문자열 마지막 문자가 줄바꿈일 경우에는 바로 앞에도 매치하지만, \z는 마지막에만 매치합니다.
\G 단정은 현재 매치한 위치가 preg_match()에서 offset 인수로 지정한 시작 지점일 경우에만 참입니다. offset 이 0이 아닐 때 \A와 다릅니다. PHP 4.3.3부터 사용할 수 있습니다.
\Q와 \E는 PHP 4.3.3부터 패턴에서 정규 표현식 메타문자를 무시하는데 사용할 수 있습니다. 예를 들면: \w+\Q.$.\E$ 문자열 끝에 위치하는 하나 이상의 단어에 .$.이 붙는 경우에 매치합니다.
PHP 5.2.4부터 \K를 매치 시작을 초기화하는데 사용할 수 있습니다. 예를 들어, 패턴 foo\Kbar는 "foobar"에 매치하지만, "bar"에 매치했다고 보고합니다. \K의 사용은 캡쳐한 서브문자열의 설정에 간섭하지 않습니다. 예를 들어, (foo)\Kbar가 "foobar"에 매치하였을 때, 첫 서브문자열은 여전히 "foo"로 설정됩니다.
유니코드 문자 속성
PHP 4.4.0과 5.1.0부터, UTF-8 모드를 선택하였을 때 일반 문자형에 매치하기 위해 사용할 수 있는 세가지 추가 회피 시퀀스가 존재합니다:
- \p{xx}
- xx 속성을 가지는 문자
- \P{xx}
- xx 속성을 가지지 않는 문자
- \X
- 확장 유니코드 시퀀스
위에서 xx로 표현되는 속성 이름은 유니코드 일반 분류 속성으로 제한됩니다. 각 문자는 두 문자 약어로 지정되는 단 하나의 속성입니다. 펄과 호환을 위해, 곡절을 시작 중괄호와 속성 이름 사이에 넣어서 부정을 지정할 수 있습니다. 예를 들면, \p{^Lu}는 \P{Lu}와 동일합니다.
\p나 \P에 한 문자만 지정하면, 그 문자로 시작하는 모든 속성을 포함합니다. 이 경우, 부정이 없으면 회피 시퀀스의 중괄호는 선택적입니다; 아래 두 에제는 같은 효과입니다:
\p{L} \pL
C | 기타 |
Cc | 제어 |
Cf | 형식 |
Cn | 미할당 |
Co | 사적 사용 |
Cs | 대리 |
L | 문자 |
Ll | 소문자 |
Lm | 변경자 |
Lo | 기타 문자 |
Lt | 표제 문자 |
Lu | 대문자 |
M | 마크 |
Mc | 자간 마크 |
Me | 동봉 마크 |
Mn | 비자간 마크 |
N | 수 |
Nd | 10진수 |
Nl | 문자수 |
No | 기타 수 |
P | 구두 |
Pc | 연결 구두 |
Pd | 대시 구두 |
Pe | 닫는 구두 |
Pf | 종료 구두 |
Pi | 초기 구두 |
Po | 기타 구두 |
Ps | 열기 구두 |
S | 심볼 |
Sc | 통화 심볼 |
Sk | 변경 심볼 |
Sm | 수학 심볼 |
So | 기타 심볼 |
Z | 구분자 |
Zl | 줄 구분자 |
Zp | 문단 구분자 |
Zs | 공백 구분자 |
"Greek"이나 "InMusicalSymbols" 같은 확장 심볼은 PCRE에서 지원하지 않습니다.
대소문자 구분 없는 매치 지정은 이 회피 시퀀스에는 영향을 주지 않습니다. 예를 들어, \p{Lu}는 항상 대문자에만 매치합니다.
\X 회피는 확장 유니코드 시퀀스를 이루는 모든 유니코드 문자에 매치합니다. \X는 (?>\PM\pM*)과 동일합니다.
즉, "마크" 속성이 없는 문자에 매치하거나, "마크" 속성에 붙는 하나 이상의 문자에 매치하고, 시퀀스를 원자 집단으로 취급합니다(아래 참고). "마크" 속성을 가지는 문자는 일반적으로 선행 문자에 영향을 주는 엑센트입니다.
유니코드 속성으로 문자를 매치하는 것은 빠르지 않습니다. PCRE가 15,000자를 넘는 데이터를 가진 구조를 검색해야 하기 때문입니다. 이것이 PCRE에서 유니코드 속성이 아닌, \d와 \w 같은 전통적인 회피 시퀀스를 사용해야 하는 이유입니다.
곡절과 달러
문자열 클래스의 밖, 기본 매칭 모드에서는 곡절 문자는 현재 매칭 위치가 목표 문자열의 시작일 경우에만 성공하는 단정입니다. 문자열 클래스 안에서 곡절은 완전히 다른 의미를 가집니다. (아래 참고)
여러 개의 선택을 가질 경우 곡절은 패턴의 처음 문자일 필요가 없지만, 패턴이 그 브랜치에 처음 매치할 경우를 나타내는 각 선택에서의 처음 문자여야 합니다. 모든 선택이 곡절로 시작하는, 목표의 처음에만 매치하는 패턴은 "고정" 패턴이라 불려집니다. (패턴을 고정하는 다른 구조도 존재합니다)
달러 문자는 매칭 위치가 목표 문자열의 마지막이거나, (기본값으로) 문자열 마지막 줄바꿈의 바로 전에 해당하는 경우에만 TRUE인 단정입니다. 선택을 가지는 패턴에서는 달러가 패턴의 마지막일 필요가 없지만, 마지막을 나타내는 모든 브랜치에서 마지막 문자여야 합니다. 달러는 문자 클래스 안에서는 특별한 의미를 가지지 않습니다.
달러의 의미는 컴파일시나 매치를 할 때 PCRE_DOLLAR_ENDONLY 옵션을 설정해서 문자열의 마지막에만 매치하도록 변경할 수 있습니다. 이는 \Z 단정에는 영향을 주지 않습니다.
PCRE_MULTILINE 옵션을 설정하면, 곡절과 달러 문자의 의미가 달라집니다. 이 경우, 목표 문자열의 처음과 마지막에 더하여, 내부의 "\n" 문자의 뒤와 앞에도 매치합니다. 예를 들어, 패턴 /^abc$/는 멀티라인 모드에서는 목표 문자열 "def\nabc"에 매치하지만, 그렇지 않다면 매치하지 않습니다. 따라서, 모든 브랜치가 "^"로 시작하는 브랜치는 단일라인 모드에서는 고정이지만, 멀티라인 모드에서는 고정이 아닙니다. PCRE_MULTILINE을 설정하면, PCRE_DOLLOR_ENDONLY 옵션을 무시합니다.
어떤 모드에서라도 \A, \Z, \z 시퀀스는 목표의 처음과 마지막에 매치할 때 사용할 수 있습니다. PCRE_MULTILINE에 관계 없이 모든 브랜치가 \A로 시작하는 패턴은 항상 고정입니다.
마침표
문자 클래스 밖에서, 패턴의 마침표는 패턴의 아무 문자에 매치합니다. 출력할 수 없는 문자도 포함하지만, (기본값으로) 줄바꿈은 포함하지 않습니다. PCRE_DOTALL 옵션을 설정하면, 마침표가 줄바꿈에도 매치합니다. 마침표의 처리는 곡절과 달러의 처리와는 완전히 독립이며, 유일한 관계는 두 경우 모두 줄바꿈 문자에 해당한다는 점입니다. 마침표는 문자 클래스 안에서는 특별한 의미를 가지지 않습니다.
한 바이트에 매치하기 위하여 \C를 사용할 수 있습니다. UTF-8 모드에서 마침표가 멀티바이트 문자에 대응하는 것에 대안입니다.
대괄호
여는 대괄호로 문자 클래스를 시작하고, 닫는 대괄호로 종료합니다. 닫는 대괄호는 그 자체로는 특별한 의미가 없습니다. 닫는 대괄호를 클래스의 멤버로 사용하려면 클래스의 가장 처음(존재한다면 시작 곡절 뒤에)에 위치하거나 백슬래시로 회피해야 합니다.
문자 클래스는 목표에서 하나의 문자에 매치합니다; 그 문자는 클래스가 정의하는 문자 세트에 존재해야 합니다. 클래스가 곡절로 시작할 경우에는, 목표 문자는 클래스 정의 세트에 존재하지 않아야 합니다. 곡절이 클래스 멤버로 필요할 때는, 처음에 위치시키지 않거나 백슬래시로 회피해야 합니다.
예를 들면, 문자 클래스 [aeiou]는 모든 소문자 모음에 매치하지만, [^aeiow]는 소문자 모음이 아닌 모든 문자에 매치합니다. 곡절은 단지 클래스에 존재하는 문자가 아닌 것들을 지정하는 편리한 방법일 뿐이라는 점에 주의하십시오. 단정이 아닙니다: 목표 문자열에서 문자를 찾아내며, 현재 위치가 문자열의 끝이면 실패합니다.
대소문자를 구별하지 않는 매칭을 설정하면, 클래스 안의 모든 문자는 대문자와 소문자 모두 매치합니다. 예를 들면, 대소문자 구별 없는 [aeiou]는 "a"와 함께 "A"도 매치하며, 대소문자 구별 없는 [^aeiou]는 구별하는 버전일 경우 매치하는 "A"에는 매치하지 않습니다.
줄바꿈 문자는 PCRE_DOTALL나 PCRE_MULTILINE 옵션의 설정에 관계 없이, 문자 클래스 안에서 특별한 방법으로 취급하지 않습니다. [^a]와 같은 클래스는 항상 줄바꿈에 매치합니다.
빼기(하이픈) 문자는 문자 클래스에서 문자의 범위를 지정하는데 사용할 수 있습니다. 예를 들어, [d-m]은 d부터 m까지의 모든 문자에 매치합니다. 빼기 문자가 클래스에서 필요하면, 백슬래시로 회피하거나, 클래스의 맨 처음이나 마지막처럼 범위로 해석할 수 없는 위치에 나타나야 합니다.
문자 "]"를 범위의 마지막으로 지정하는 것은 불가능합니다. [W-]46]과 같은 패턴은 두 문자를 가지는 클래스("W"와 "-") 뒤에 일반 문자열 "46]"이 붙는 형태로 해석합니다. 그러므로 "W46]"이나 "-46]"에 매치합니다. 그러나, "]"를 백슬래시로 회피하면 범위의 끝으로 해석하기에, [W-\]46]은 범위와 두개의 개별 문자를 가지는 하나의 클래스로 해석합니다. 범위의 마지막으로 "]"의 8진수 및 16진수 표현을 사용할 수도 있습니다.
범위는 아스키 순서에 따라 정해집니다. [\000-\037]처럼 숫자로 지정한 문자를 사용할 수도 있습니다. 대소문자 구별 없는 매칭을 설정하면, 범위 안의 문자들도 대소문자 구별 없이 매칭합니다. 예를 들면, [W-c]는 대소문자 구별 없는 [][\^_`wxyzabc]와 동일하며, "fr" 로케일의 문자표를 사용하면, [\xc8-\xcb]는 대소문자 구별 없이 엑센트 E 문자에 매치합니다.
문자형 \d, \D, \s, \S, \w, \W도 문자 클래스에서 사용할 수 있고, 해당하는 문자들을 클래스에 추가합니다. 예를 들어, [\dABCDEF]는 모든 16진수에 매치합니다. 곡절과 위에서 대문자형을 지정하여 소문자형을 매칭하는 데에 편리하게 제한을 할 수 있습니다. 예를 들어, 클래스 [^\W_]는 언더스코어를 제외한 모든 문자와 숫자에 매치합니다.
\, -, ^(시작 위치), 종료 ]를 제외한 모든 영숫자가 아닌 문자는 문자 클래스에서 특별한 의미를 가지지 않지만, 회피해도 문제가 발생하지는 않습니다.
수직 바
수직 바 문자는 선택 패턴을 구별할 때 사용합니다. 예를 들어, 패턴 gilbert|sullivan은 "gilbert"나 "sullivan"에 매치합니다. 어떠한 수의 선택도 사용할 수 있고, 빈 선택도 허용합니다. (빈 문자열에 매칭합니다) 매칭 프로세스는 각 선택을 왼쪽에서 오른쪽으로 시도하며, 가장 먼저 선택한 것을 사용합니다. 서브패턴(아래에서 정의) 안에서 선택을 하면, "성공"은 서브패턴의 선택과 함께 메인 패턴의 나머지 부분도 매치하는 것을 의미합니다.
내부 옵션 설정
PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_EXTENDED의 설정은 "(?"와 ")" 사이에 펄 옵션 문자 시퀀스로 패턴 안에서 변경할 수 있습니다. 옵션 문자는 다음과 같습니다.
i | PCRE_CASELESS에 해당 |
m | PCRE_MULTILINE에 해당 |
s | PCRE_DOTALL에 해당 |
x | PCRE_EXTENDED에 해당 |
U | PCRE_UNGREEDY에 해당 |
X | PCRE_EXTRA에 해당 |
J | PCRE_INFO_JCHANGED에 해당 |
예를 들어, (?im)은 대소문자 구별 없는 멀티라인 매칭을 설정합니다. 하이픈과 함께 사용하여 옵션을 해제할 수도 있습니다. 설정과 해제를 동시에 하는 것도 허용합니다. (?im-sx)를 지정하면, PCRE_CASELESS와 PCRE_MULTILINE를 설정하고 PCRE_DOTALL와 PCRE_EXTENDED를 해제합니다. 문자가 하이픈 앞과 뒤에 모두 나타나면, 옵션을 해제합니다.
최고 단계에서(서브패턴 괄호 밖에서) 옵션을 변경하면, 패턴의 나머지 부분에만 적용됩니다. 그러므로, /ab(?i)c/는 "abc"와 "abC"에만 매치합니다. 이 작동은 PCRE 4.0에서 변경되었으며, PHP 4.3.3부터 포함되었습니다. 이 버전 전에는, /ab(?i)c/는 /abc/i와 동일했습니다. ("ABC"나 "aBc" 등에도 매치)
서브패턴 안에서 옵션을 변경하면, 효과가 다릅니다. 이는 펄 5.005에서 작동 변경점입니다. 서브패턴 안에서 옵션 변경은 따라오는 서브패턴의 부분에만 영향을 미칩니다. 그러므로 (a(?i)b)c은 abc와 aBc만을 매치합니다. (PCRE_CASELESS를 사용하지 않는 경우) 이 의미로, 옵션을 패턴의 다른 부분에서 다른 설정으로 할 수 있습니다. 하나의 선택에서 변경한 것은 같은 서브패턴에서 지속적으로 사용합니다. 예를 들면, (a(?i)b|c)는 "ab", "aB", "c", "C"에 매치합니다. "C"는 옵션을 설정하기 전에 나누어진 브랜치에 해당하지만, 이상한 동작일지라도, 처리 시에 옵션 설정의 효율성을 위해서 매치합니다.
PCRE 전용 옵션 PCRE_UNGREEDY와 PCRE_EXTRA는 U와 X 문자를 사용하여 펄 호환 옵션과 같은 방법으로 변경할 수 있습니다. (?X) 플래그는 특별하기에, 최고 레벨에서라도 다른 기능을 켜기 전에 위치해야만 합니다. 가장 처음에 놓는 편이 좋습니다.
서브패턴
서브패턴은 괄호로 구분하며, 중첩할 수 있습니다. 패턴의 부분을 서브패턴으로 만드는 것은 두가지 일을 합니다:
1. 선택 세트를 지역화합니다. 예를 들어, 패턴 cat(aract|erpillar|)는 "cat", "cataract", "caterpillar" 중에 하나에 매치합니다. 괄호가 없으면, "cataract", "erpillar", 또는 빈 문자열에 매치할 것입니다.
2. 서브패턴을 (위에서 정의한) 캡쳐한 서브패턴으로 지정합니다. 모든 패턴이 매치하면, 매치한 주제 문자열이 pcre_exec()의 ovector를 통하여 호출자에게 넘겨집니다. 열린 괄호는 왼쪽에서 오른쪽으로 세어서 (1부터 시작) 캡쳐한 서브패턴에 번호를 부여합니다.
예를 들어, 문자열 "the red king"이 패턴 the ((read|white) (king|queen)에 매치한다면, "red king", "red", "king" 부분 문자열을 잡아내고, 1, 2, 3의 숫자를 부여합니다.
평범한 괄호로 두 함수를 채우는 것이 항상 도움이 되지 않는게 사실입니다. 종종 잡아내는 일 없이 서브패턴으로 묶을 필요가 있습니다. 여는 괄호 뒤에 "?:"을 붙이면, 그 서브패턴은 잡히지 않고, 잡아낸 서브패턴의 수로 세어지지 않습니다. 예를 들어, 문자열 "the white queen"이 패턴 the ((?:red|white) (king|queen)) 에 매치하면, 잡아낸 서브문자열은 "white queen"과 "queen"이고, 1과 2를 부여받습니다. 잡아낼 수 있는 서브 문자열의 최대수는 99이고, 잡아내는 것과 잡아내지 않는 것을 포함한 모든 서브패턴의 최대수는 200입니다.
편리한 단축형으로, 잡아내지 않는 서브패턴을 시작할 때 "?"와 ":" 사이에 옵션 문자를 넣어서 어떠한 옵션이라도 설정할 수 있습니다. 그러므로 두 패턴
(?i:saturday|sunday) (?:(?i)saturday|sunday)
는 완전히 동일한 문자열에 매치합니다. 왜냐하면 대체 분기는 왼쪽에서 오른쪽으로 시도하며, 옵션을 서브패턴이 종료될 때까지 재설정하지 않습니다. 하나의 분기에서 설정한 옵션은 계속되는 분기에 영향을 주므로, 위 패턴은 "SUNDAY"와 "Saturday"에도 매치합니다.
PHP 4.3.3부터 (?P<name>pattern)으로 서브패턴에 이름을 넣을 수 있습니다. 이렇게 하면, 매치 배열은 숫자 대신 문자열 키를 가지게 됩니다.
반복
반복은 다음 항목들에 덧붙이는 수량어로 지정합니다:
- 회피할 수 있는 하나의 문자
- . 메타 문자
- 문자 클래스
- 역참조 (다음 섹션 참고)
- 서브패턴 묶음(단정이 아닌 경우 - 아래 참고
일반적인 반복 수량어는 허용하는 매치 수의 최소값과 최대값을 중괄호 안에 쉼표로 구분하여 지정합니다. 수는 65535보다 작아야하며, 처음 수는 두번째 수보다 작거나 같아야만 합니다. 예를 들면: z{2,4}는 "zz", "zzz", "zzzz"에 매치합니다. 닫는 괄호 자체는 특수 문자가 아닙니다. 두번째 수를 생략하고, 쉼표가 존재하면 최대 제한이 없어집니다; 두번째 수와 쉼표를 모두 생략하면, 수량어는 요구하는 매치 수의 정확한 수를 지정합니다. 그러므로, [aeiou]{3,}는 3개 이상의 모음에 매치하지만, \d{8}은 8자리 수에만 매치합니다. 수량어를 허용하지 않는 위치에서 중괄호를 여는 것은 수량어 구문으로 매치하지 않고, 일반 문자로 취급합니다. 예를 들어, {,6}는 수량어가 아닌, 4 문자의 일반 문자열입니다.
수량어 {0}을 허용하며, 이는 이전의 항목과 수량어가 존재하지 않는 표현식으로 작동합니다.
편의성을 위해서 (그리고 역사적인 호환성을 위해서) 가장 일반적인 세 수량어는 단일 표현을 가지고 있습니다:
* | {0,}과 동일 |
+ | {1,}과 동일 |
? | {0,1}과 동일 |
상위 제한이 없는 수량어에 문자를 매치지키지 않음으로써, 다음 서브패턴과 같이 무한루프를 만들수 있습니다. 예를 들면: (a?)*
Perl과 PCRE 예전 버전에선 이러한 패턴에 대해서 컴파일 시에 오류를 발생시켰습니다. 그러나, 이것이 유용한 경우가 있어서, 지금은 이러한 패턴이 받아들여집니다. 그러나 서브패턴의 반복이 실제로는 어떠한 문자도 매치하지 않을 때, 루프는 강제로 깨어집니다.
By default, the quantifiers are "greedy", that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences /* and */ and within the sequence, individual * and / characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ to the string /* first comment */ not comment /* second comment */ fails, because it matches the entire string due to the greediness of the .* item.
However, if a quantifier is followed by a question mark, then it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern /\*.*?\*/ does the right thing with the C comments. The meaning of the various quantifiers is not otherwise changed, just the preferred number of matches. Do not confuse this use of question mark with its use as a quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in \d??\d which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches.
If the PCRE_UNGREEDY option is set (an option which is not available in Perl) then the quantifiers are not greedy by default, but individual ones can be made greedy by following them with a question mark. In other words, it inverts the default behaviour.
+이 따라오는 수량어는 "소유권"입니다. 이 경우 최대한 많은 문자를 먹고, 나머지 패턴으로 돌려주지 않습니다. 그러므로 .*abc은 "aabc"에 매치하지만 .*+abc는 매치하지 않습니다. .*+가 전체 문자열을 먹기 때문입니다. 소유권 수량어는 PHP 4.3.3부터 빠른 처리를 위해서 사용될 수 있습니다.
괄호로 싼 서브패턴이 2 이상의 최소 반복이나 최대 제한을 가지면, 컴파일한 패턴은 최소/최대의 크기에 따라서 더 많은 공간이 필요합니다.
패턴이 .*이나 .{0,}로 시작하고 PCRE_DOTALL 옵션(Perl의 /s와 동일)이 설정되어 .이 줄바꿈에도 매치하게 되면, 패턴은 무조건 고정됩니다. 주제 문자열에 무엇이 붙어도 모든 문자가 포함되고, 처음 이후에 다른 위치를 잡을 수 없게 되기 때문입니다. PCRE는 그러한 패턴을 \A가 앞에 있는 것으로 취급합니다. 주제 문자열에 줄바꿈이 없다는 걸 알 경우엔, 이러한 최적화를 얻기 위해서 .*로 시작하는 패턴에 PCRE_DOTALL을 설정할 가치가 있습니다. 다른 대안은 명시적으로 ^를 사용해서 위치를 표시할 수 있습니다.
잡아내는 서브패턴이 반복되면, 잡아낸 서브문자열은 마지막 반복에 매치합니다. 예를 들어, (tweedle[dume]{3}\s*)+ 가 "tweedledum tweedledee"에 매치한 뒤에, 잡아낸 서브문자열의 값은 "tweedledee"입니다. 그러나, 중첩된 잡아내는 서브패턴이 있으면, 잡아낸 값이 이전의 반복에서 설정될 수 있습니다. 에를 들어, /(a|(b))+/ 가 "aba"에 매치한 뒤에, 두번째 잡아낸 서브 문자열의 값은 "b"입니다.
역참조
문자열 클래스 밖에서, 백슬래시 뒤에 0을 초과하는 수(몇자리라도 될 수 있습니다)가 따라오는 경우는 패턴에서 이전에 잡아낸(즉, 왼쪽의) 서브패턴의 역참조입니다. 그 위치에서 잡아내는 왼쪽 괄호로 주어집니다.
그러나 백슬래시 뒤에 붙는 수가 10보다 작으면, 항상 역참조로 취급하여 전체 패턴에 충분한 잡아내는 왼쪽 괄호가 없으면 오류가 발생합니다. 즉, 10 미만의 참조의 왼쪽에는 참조를 가리키는 괄호가 필요 없습니다. 위에서 "백슬래시" 섹션을 참고하여 백슬래시에 따라오는 수를 다루는 상세를 알아보십시오.
A back reference matches whatever actually matched the capturing subpattern in the current subject string, rather than anything matching the subpattern itself. So the pattern (sens|respons)e and \1ibility matches "sense and sensibility" and "response and responsibility", but not "sense and responsibility". If caseful matching is in force at the time of the back reference, then the case of letters is relevant. For example, ((?i)rah)\s+\1 matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original capturing subpattern is matched caselessly.
There may be more than one back reference to the same subpattern. If a subpattern has not actually been used in a particular match, then any back references to it always fail. For example, the pattern (a|(bc))\2 always fails if it starts to match "a" rather than "bc". Because there may be up to 99 back references, all digits following the backslash are taken as part of a potential back reference number. If the pattern continues with a digit character, then some delimiter must be used to terminate the back reference. If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty comment can be used.
A back reference that occurs inside the parentheses to which it refers fails when the subpattern is first used, so, for example, (a\1) never matches. However, such references can be useful inside repeated subpatterns. For example, the pattern (a|b\1)+ matches any number of "a"s and also "aba", "ababaa" etc. At each iteration of the subpattern, the back reference matches the character string corresponding to the previous iteration. In order for this to work, the pattern must be such that the first iteration does not need to match the back reference. This can be done using alternation, as in the example above, or by a quantifier with a minimum of zero.
이름 있는 서브패턴에 대한 역참조는 (?P=name), 혹은 PHP 5.2.4부터 \k<name>, \k'name', \k{name}, \g{name}으로 사용할 수 있습니다.
패턴 변경자
아래 목록은 현재 존재하는 PCRE 변경자입니다. 괄호 안의 이름은 각 변경자에 대한 PCRE 내부의 이름입니다. 공백과 줄바꿈은 변경자에서 무시되며, 다른 문자는 오류를 발생합니다.
- i (PCRE_CASELESS)
- 이 변경자를 지정하면, 패턴의 문자는 대문자와 소문자를 구별하지 않습니다.
- m (PCRE_MULTILINE)
- 기본적으로, PCRE는 주어진 문자열을 하나의 "줄"로 취급합니다. (실제로 몇개의 라인을 가지더라도) "줄 시작" 메타문자(^)는 문자열의 처음만을 인식하며, "줄 끝" 메타문자($)는 문자열의 끝이나 (D 변경자가 지정되지 않는 한) 마지막 뉴라인의 직전만을 인식합니다. 이는 펄과 같습니다. 이 변경자를 지정하면, "줄 시작"과 "줄 끝"은 주어진 문자열의 모든 뉴라인 직후와 직전을 인식합니다. respectively, as well as at the very start and end. 이는 펄의 /m 변경자와 동일합니다. 주어진 문자열에 "\n" 문자가 존재하지 않거나 ^나 $ 패턴이 일어나지 않으면 이 변경자는 아무런 효과가 없습니다.
- s (PCRE_DOTALL)
- 이 변경자가 지정되면, 패턴의 점 메타문자는 뉴라인을 포함하는 모든 문자를 인식합니다. 지정하지 않으면, 뉴라인은 제외됩니다. 이 변경자는 펄의 /s 변경자와 동일합니다. [^a]와 같은 부정클래스는 이 변경자에 관계 없이 항상 뉴라인 문자를 포함합니다.
- x (PCRE_EXTENDED)
- 이 변경자가 지정되면, 공백 문자는 이스케이프 되거나 문자 클래스 안에 있을 경우를 제외하고, 완전히 무시합니다. 문자 클래스 밖에서 이스케이프 되지 않은 # 사이와 뉴라인 문자 다음의 문자도 무시합니다. 이는 펄의 /x 변경자와 같고, 복잡한 패턴 안에 코멘트를 사용할 수 있게 합니다. 그러나 이는 데이터 문자에만 해당하는 점에 주의하십시오. 공백 문자는 패턴의 특별한 문자 시퀀스 안에는 존재할 수 없습니다. 예를 들면, 조건 서브 패턴을 나타내는 (?( 시퀀스에는 나와서는 안됩니다.
- e (PCRE_REPLACE_EVAL)
- 이 변경자를 지정하면, preg_replace()는 변경할 문자열을 PHP 코드로 처리하고, 그 결과를 검색된 문자열의 이용하여 일반적인 치환을 합니다. 작은 따옴표, 큰 따옴표, 백슬래시와 NULL 문자는 백슬래시로 이스케이프됩니다.
preg_replace()만 이 변경자를 사용합니다; 다른 PCRE 함수는 무시합니다.
Note: 이 변경자는 PHP 3에서는 사용할 수 없습니다.
- A (PCRE_ANCHORED)
- 이 변경자를 지정하면, 패턴을 강제적으로 "고정"합니다. 이는 ("주어진 문자열"에서) 검색된 문자열의 시작에만 매치도록 강제합니다. 패턴 자체에서 특정한 구조를 가지게 하는, 펄에서는 유일한 방법으로 같은 효과를 얻을 수 있습니다.
- D (PCRE_DOLLAR_ENDONLY)
- 이 변경자가 설정되면, 패턴의 달러($) 메타문자는 주어진 문자열의 마지막에만 대응합니다. 이 변경자 없이는, 달러는 마지막 문자가 뉴라인일 경우에는 바로 직전의 문자에도 매칭합니다. (마지막이 아닌 뉴라인은 제외합니다) 이 변경자는 m 변경자가 지정되었을때는 무시됩니다. 펄에는 이 변경자가 존재하지 않습니다.
- S
- 패턴이 여러번 이용되면, 매칭에 걸리는 시간을 절약하기 위해서 분석에 더 많은 시간을 들일 가치가 있습니다. 이 변경자를 지정하면, 추가 분석을 행합니다. 현 시점에서, 패턴의 분석은 하나의 고정된 시작 문자를 가지지 않는 비고정 패턴에만 유용합니다.
- U (PCRE_UNGREEDY)
- 이 변경자는 수량 지시의 "greediness"를 뒤집습니다. 그리하여 기본값으로 not greedy하게 합니다. 하지만 "?"가 붙으면 greedy하게 됩니다. 이는 펄과 호환되지 않습니다. 패턴 안에서 변경자 설정으로 (?U)처럼 지정하거나, 수량지시어 뒤의 물음표로 지정할 수 있습니다. (예. .*?)
- X (PCRE_EXTRA)
- 이 변경자는 펄과 호환되지 않는 PCRE의 추가 기능을 사용하게 합니다. 패턴의 문자와 결합된 백슬래시가 특별한 의미를 지니지 않을 경우에 에러를 발생시켜서, 차후에 추가 기능을 위해 예약해둡니다. 기본적으로 펄은, 문자와 결합된 백슬래시가 특별한 의미를 지니지 않을 경우에는 글자로 취급합니다. 이 변경자는 다른 기능을 제어하지 않습니다.
- J (PCRE_INFO_JCHANGED)
- 내부 옵션 (?J) 설정은 영역의 PCRE_DUPNAMES 옵션을 변경합니다. 서브패턴에 동일한 이름을 허용합니다.
- u (PCRE_UTF8)
- 이 변경자는 펄과 호환되지 않는 PCRE의 추가 기능을 사용하게 합니다. 패턴 문자열을 UTF-8으로 취급합니다. 유닉스에서는 PHP 4.1.0부터, win32에서는 PHP 4.2.3부터 사용할 수 있습니다. PHP 4.3.5부터 패턴의 UTF-8 유효성이 검사됩니다.