反斜線(xiàn)有多種用法。首先,如果緊接著是一個(gè)非字母數(shù)字字符,表明取消 該字符所代表的特殊涵義。這種將反斜線(xiàn)作為轉(zhuǎn)義字符的用法在字符類(lèi) 內(nèi)部和外部都可用。
比如,如果你希望匹配一個(gè) "*" 字符,就需要在模式中寫(xiě)為 "\*"。 這適用于一個(gè)字符在不進(jìn)行轉(zhuǎn)義會(huì)有特殊含義的情況下。 但是, 對(duì)于非數(shù)字字母的字符,總是在需要其進(jìn)行原文匹配的時(shí)候在它前面增加一個(gè)反斜線(xiàn), 來(lái)聲明它代表自己,這是安全的。如果要匹配一個(gè)反斜線(xiàn),那么在模式中使用 ”\\”。
注意:
反斜線(xiàn)在單引號(hào)和雙引號(hào) PHP 字符串 中都有特殊含義。因此要匹配一個(gè)反斜線(xiàn) \,正則表達(dá)式寫(xiě)法是 \\, 然后 PHP 代碼中需要轉(zhuǎn)義寫(xiě)成 "\\\\" 或 '\\\\'。
如果一個(gè)模式被使用 PCRE_EXTENDED 選項(xiàng)編譯, 模式中的空白字符(除了字符類(lèi)中的)和未轉(zhuǎn)義的#到行末的所有字符都會(huì)被忽略。 要在這種情況下使用空白字符或者#,就需要對(duì)其進(jìn)行轉(zhuǎn)義。
反斜線(xiàn)的第二種用途提供了一種對(duì)非打印字符進(jìn)行可見(jiàn)編碼的控制手段。 除了二進(jìn)制的 0 會(huì)終結(jié)一個(gè)模式外,并不會(huì)嚴(yán)格的限制非打印字符(自身)的出現(xiàn), 但是當(dāng)一個(gè)模式以文本編輯器的方式編輯準(zhǔn)備的時(shí)候, 使用下面的轉(zhuǎn)義序列相比使用二進(jìn)制字符會(huì)更加容易:
\cx
的確切效果如下: 如果x
是一個(gè)小寫(xiě)字母,它被轉(zhuǎn)換為大寫(xiě)。接著,
將字符的第6位(十六進(jìn)制 40,右數(shù)第一個(gè)位為第0位)取反。
比如\cz
成為十六進(jìn)制的1A,\c{
成為十六進(jìn)制3B,
\c;
成為十六進(jìn)制7B。
在”\x
”后面,讀取兩個(gè)十六進(jìn)制數(shù)(字母可以是大寫(xiě)或小寫(xiě))。
在UTF-8模式,
“\x{…}
”允許使用, 花括號(hào)內(nèi)的內(nèi)容是十六進(jìn)制有效數(shù)字。
它將給出的十六進(jìn)制數(shù)字解釋為 UTF-8 字符代碼。原來(lái)的十六進(jìn)制轉(zhuǎn)義序列,
\xhh
,
匹配一個(gè)雙字節(jié)的UTF-8字符,如果它的值大于127
在”\0
”之后, 讀取兩個(gè)八進(jìn)制數(shù)。所有情況下,如果數(shù)少于2個(gè),則直接使用。
序列 ”\0\x\07
” 指定了兩個(gè)二進(jìn)制 0 緊跟著一個(gè) BEL 字符。
請(qǐng)確保初始的 0 之后的兩個(gè)數(shù)字是合法的八進(jìn)制數(shù)。
處理一個(gè)反斜線(xiàn)緊跟著的不是0的數(shù)字的情況比較復(fù)雜。在字符類(lèi)外部, PCRE 讀取它并以十進(jìn)制讀取緊隨其后的數(shù)字。 如果數(shù)值小于 10, 或者之前捕獲到了該數(shù)字能夠代表的左括號(hào)(子組), 整個(gè)數(shù)字序列被認(rèn)為是后向引用。后向引用如何工作在后面描述, 接下來(lái)就會(huì)討論括號(hào)子組。
在一個(gè)字符類(lèi)里面,或者十進(jìn)制數(shù)大于 9 并且沒(méi)有那么多的子組被捕獲, PCRE 重新讀取反斜線(xiàn)后的第三個(gè) 8 進(jìn)制數(shù)字,并且從最低的 8 位生成單字節(jié)值。 任何的后續(xù)數(shù)字都代表它們自身。例如:
注意,八進(jìn)制值的 100 或者更大的值必須沒(méi)有前置的0引導(dǎo), 因?yàn)槊看巫疃嘧x取3個(gè)8進(jìn)制位.
所有序列定義的單字節(jié)值都可以在字符類(lèi)內(nèi)部或外部使用。另外,在字符類(lèi)中,
序列 ”\b
” 解釋為退格字符(hex 08)。
字符類(lèi)外它又有不同的意義(下面有描述)。
反斜線(xiàn)的第三種用法是用來(lái)描述特定的字符類(lèi):
上面每一對(duì)轉(zhuǎn)義序列都代表了完整字符集中兩個(gè)不相交的部分, 任意字符一定會(huì)匹配其中一個(gè),同時(shí)一定不會(huì)匹配另外一個(gè)。
"空白字符"(whitespace)是 HT (9)、LF (10)、FF (12)、CR (13)、space (32)。 然而,若發(fā)生了本地化匹配,在代碼點(diǎn) 128-255 范圍內(nèi)亦可能出現(xiàn)空白字符, 比如說(shuō) NBSP (A0)。
單詞字符指的是任意字母、數(shù)字、下劃線(xiàn)。
也就是說(shuō)任意可以組成perl單詞的字符。
字母和數(shù)字的定義通過(guò)PCRE字符表控制,可以通過(guò)指定地域設(shè)置使其匹配改變。比如,
在法國(guó) (fr) 本地化設(shè)置中,一些超過(guò) 128 的字符代碼被用于重音字母,
它們可以實(shí)用 \w
匹配。
這些字符類(lèi)序列在字符類(lèi)內(nèi)部或外部都可以出現(xiàn)。 他們每次匹配所代表的字符類(lèi)型中的一個(gè)字符。 如果當(dāng)前匹配點(diǎn)位于目標(biāo)字符串末尾, 它們中的所有字符都匹配失敗, 因?yàn)闆](méi)有字符讓它們匹配了。
反斜線(xiàn)的第四種用法是一些簡(jiǎn)單的斷言。 一個(gè)斷言指定一個(gè)必須在特定位置匹配的條件, 它們不會(huì)從目標(biāo)字符串中消耗任何字符。 接下來(lái)我們會(huì)討論使用子組的更加復(fù)雜的斷言。 反斜線(xiàn)斷言包括:
這些斷言不能出現(xiàn)在字符類(lèi)中(但是注意, “\b
”在字符類(lèi)中有不同的意義,
表示的是退格(backspace)字符)
一個(gè)單詞邊界表示的是在目標(biāo)字符串中,
當(dāng)前字符和前一個(gè)字符不同時(shí)匹配\w
或\W
(一個(gè)匹配\w
,
一個(gè)匹配\W
),
或者作為字符串開(kāi)始或結(jié)尾字符的時(shí)候當(dāng)前字符匹配\w
。
\A
, \Z
,
\z
斷言不同于傳統(tǒng)的^
和$
(詳見(jiàn) 錨),
因?yàn)樗麄冇肋h(yuǎn)匹配目標(biāo)字符串的開(kāi)始和結(jié)尾,而不會(huì)受模式修飾符的限制。
它們不受PCRE_MULTILINE,PCRE_DOLLAR_ENDONLY選項(xiàng)的影響。
\Z
和 \z
之間的不同在于當(dāng)字符串結(jié)束字符時(shí)換行符時(shí) \Z
會(huì)將其看做字符串結(jié)尾匹配,
而 \z
只匹配字符串結(jié)尾。
\G
斷言在指定了offset
參數(shù)的preg_match() 調(diào)用中,
僅在當(dāng)前匹配位置在匹配開(kāi)始點(diǎn)的時(shí)候才是成功的。
當(dāng) offset
的值不為 0 的時(shí)候,
它與 \A
是不同的。 譯注:另外一點(diǎn)與 \A
的不同之處在于使用 preg_match_all() 時(shí),
每次匹配 \G
只是斷言是否是匹配結(jié)果的開(kāi)始位置,
而 \A
斷言的則是匹配結(jié)果的開(kāi)始位置是否在目標(biāo)字符串開(kāi)始位置。
\Q
和 \E
可以用于在模式中忽略正則表達(dá)式元字符。比如:
\w+\Q.$.\E$
會(huì)匹配一個(gè)或多個(gè)單詞字符,緊接著 .$.
,
最后錨向字符串末尾。
\K
可以用于重置匹配。 比如,
foot\Kbar
匹配”footbar”。
但是得到的匹配結(jié)果是 ”bar”。但是, \K
的使用不會(huì)干預(yù)到子組內(nèi)的內(nèi)容,
比如 (foot)\Kbar
匹配 ”footbar”,第一個(gè)子組內(nèi)的結(jié)果仍然會(huì)是 ”foo”。譯注:
\K 放在子組和子組外面的效果是一樣的。