內(nèi)部選項設(shè)置

PCRE_CASELESS、 PCRE_MULTILINE、 PCRE_DOTALLPCRE_UNGREEDY、 PCRE_EXTRAPCRE_EXTENDED、 PCRE_DUPNAMES 等模式修飾符設(shè)置可以在模式內(nèi)部通過一個 Perl 選項字符序列來設(shè)置, 語法是 (?修飾符),可用的修飾符有:

Internal option letters
i for PCRE_CASELESS
m for PCRE_MULTILINE
s for PCRE_DOTALL
x for PCRE_EXTENDED
U for PCRE_UNGREEDY
X for PCRE_EXTRA
J for PCRE_INFO_JCHANGED

比如,(?im) 設(shè)置表明多行大小寫不敏感匹配。同樣可以用它來取消這些設(shè)置, 比如 (?im-sx) 設(shè)置了 PCRE_CASELESSPCRE_MULTILINE, 但是同時取消了 PCRE_DOTALLPCRE_EXTENDED。 如果一個字母即出現(xiàn)在 - 之前, 也出現(xiàn)在 - 之后,這個選項被取消設(shè)置。

當(dāng)一個選項在模式的最上級(也就是說不在子組中)時, 這個改變會影響模式中剩余部分。比如 /ab(?i)c/ 僅僅匹配 ”abc” 和 ”abC”。

如果一個選項在子組中設(shè)置,產(chǎn)生的影響是不同的。這是 Perl 5.005 中行為的一個變種。 一個選項在子組內(nèi)部設(shè)置,僅僅改變子組中剩余的部分, 因此 (a(?i)b)c 僅僅匹配 ”abc” 和 ”aBc” (假設(shè)沒有使用 PCRE_CASELESS 選項)。 這就意味著選項在模式的不同位置可以造成不同的影響。 在同一個子模式中, 一個分支的選項設(shè)置回穿透到后面剩余的其他分支中去。 比如 (a(?i)b|c) 匹配”ab”, “aB”, “c” 和 ”C”。 盡管在匹配 ”C” 時第一個分支會在選項被設(shè)定前就被丟棄。 這是因為選項的設(shè)定是在編譯期確定的,否則可能會帶來非常怪異的行為。

PCRE 專用選項 PCRE_UNGREEDYPCRE_EXTRA 可以和 Perl 兼容選項以同樣的方式來改變, 分別使用字母 U 和 X。 (?X) 標(biāo)記設(shè)定有些特殊,它必須出現(xiàn)在任何其他特性之前, 最好放在最開頭的位置。