정규식(PCRE) PCRE Patterns Internal option setting

PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED 및 PCRE_DUPNAMES의 설정은 "(?"와 ")" 사이에 묶인 Perl 옵션 문자 시퀀스에 의해 패턴 내에서 변경할 수 있습니다.

옵션 문자는 다음과 같습니다.

내부 옵션 문자

i for PCRE_CASELESS
m for PCRE_MULTILINE
s for PCRE_DOTALL
x for PCRE_EXTENDED
U for PCRE_UNGREEDY
X for PCRE_EXTRA (PHP 7.3.0부터 더 이상 지원되지 않음)
J for PCRE_INFO_JCHANGED

예를 들어, (?im)은 대소문자를 구분하지 않는(대소문자 없는) 여러 줄 일치를 설정합니다. 문자 앞에 하이픈을 붙여 이러한 옵션을 설정 해제할 수도 있으며, PCRE_DOTALLPCRE_EXTENDED를 설정 해제하면서 PCRE_CASELESSPCRE_MULTILINE을 설정하는 (?im-sx)와 같은 조합 설정 및 설정 해제도 허용됩니다. 하이픈 앞뒤에 문자가 모두 나타나면 옵션이 설정되지 않은 것입니다.

옵션 변경이 최상위 수준에서 발생하면(즉, 하위 패턴 괄호 안이 아님), 변경 사항은 뒤따르는 패턴의 나머지 부분에 적용됩니다. 따라서 /ab(?i)c/는 "abc" 및 "abC"와만 일치합니다.

서브패턴 내에서 옵션 변경이 발생하면 효과가 달라집니다. 이것은 Perl 5.005의 동작 변경 사항입니다. 하위 패턴 내부의 옵션 변경은 하위 패턴의 해당 부분에만 영향을 미치므로 (a(?i)b)c는 abc 및 aBc와 일치하고 다른 문자열과 일치하지 않습니다(PCRE_CASELESS가 사용되지 않는다고 가정). 이를 통해 패턴의 다른 부분에서 다른 설정을 갖도록 옵션을 만들 수 있습니다. 한 대안에서 이루어진 모든 변경 사항은 동일한 하위 패턴 내에서 후속 분기로 계속됩니다. 예를 들어, (a(?i)b|c)는 "ab", "aB", "c" 및 "C"와 일치하지만 "C"와 일치할 때 옵션 설정 전에 첫 번째 분기가 포기됩니다. 이는 옵션 설정의 영향이 컴파일 시간에 발생하기 때문입니다. 그렇지 않으면 매우 이상한 행동이 있을 것입니다.

PCRE 관련 옵션 PCRE_UNGREEDYPCRE_EXTRA는 각각 U 및 X 문자를 사용하여 Perl 호환 옵션과 동일한 방식으로 변경할 수 있습니다. (?X) 플래그 설정은 최상위 레벨에 있더라도 켜는 추가 기능보다 패턴에서 항상 먼저 발생해야 한다는 점에서 특별합니다. 처음에 넣는 것이 가장 좋습니다.