이 세상에 하나는 남기고 가자

이 세상에 하나는 남기고 가자

세상에 필요한 소스코드 한줄 남기고 가자

PHP 정규식(PCRE)의 모든 것 - 앵커(Anchors)

유영재

Anchors (앵커)

곡절 부호(^)

캐릭터 클래스 외부의 기본 일치 모드에서 곡절 부호(^)는 현재 일치하는 점이 제목 문자열의 시작 부분에 있는 경우에만 참(true)인 어설션이다. 캐릭터 클래스 내에서 곡절 부호(^)는 완전히 다른 의미를 지닌다.

여러 가지 선택이 포함되어 있는 경우 곡절 부호(^)는 패턴의 첫 번째 문자일 필요는 없지만 패턴이 해당 분기와 일치하는 경우 나타나는 각 대체 방법의 첫 번째 문자여야 한다. 가능한 모든 선택이 곡절 부호(^)로 시작하는 경우, 즉 패턴이 문장 시작 부분에서만 일치하도록 제한되면 "고정(anchored)" 패턴이라고 한다. (패턴을 고정시킬 수 있는 다른 구조도 있다.)

달러 부호($)

달러 부호($)는 기본적으로 현재 일치 지점이 제목 문자열의 끝에 있거나 문자열의 마지막 문자인 줄바꿈 문자 바로 앞에 있는 경우에만 참(true)이 되는 어설션이다. 달러는 캐릭터 클래스에서 특별한 의미를 가지지 않는다.

달러 부호($)는 여러 가지 선택이 포함된 경우 패턴의 마지막 문자일 필요는 없지만 마지막을 나타내는 모든 선택에서 마지막 문자여야 한다.

PCRE 변경자의 영향

PCRE_DOLLAR_ENDONLY 옵션을 컴파일 또는 매칭 시점에 설정하여 문자열의 맨 끝에서만 일치하도록 달러 부호의 의미를 변경할 수 있다. 이것은 \Z 어설션에 영향을 주지 않는다.

PCRE_MULTILINE 옵션이 설정된 경우 곡절 부호 및 달러 부호의 의미가 변경된다. 이 경우, 목표 문자열의 처음과 마지막에 더하여, 내부의 "\n" 문자의 앞과 뒤에도 일치한다. 예를 들어, 패턴 /^abc$/는 여러 줄 모드에서 제목 문자열 "def\nabc"와 일치하지만 그렇지 않은 경우는 일치하지 않는다. 따라서 모든 분기가 "^"로 시작하는 분기는 단일 행 모드에서는 고정이지만, 다중 행 모드에서는 고정이 아니다. PCRE_MULTILINE이 설정되면 PCRE_DOLLAR_ENDONLY 옵션이 무시된다.

\A, \Z\z 시퀀스를 사용하여 두 모드 모두에서 제목의 시작과 끝을 일치시킬 수 있다. 그리고 패턴의 모든 가지가 \A로 시작하면 PCRE_MULTILINE이 설정되었는지 여부에 관계없이 항상 고정된다.


comments powered by Disqus