在一個(gè)字符類(lèi)外面, 反斜線(xiàn)緊跟一個(gè)大于 0 (可能還有一位數)的數字就是一個(gè)到模式中之前出現的某個(gè)捕獲組的后向引用。
如果緊跟反斜線(xiàn)的數字小于 10, 它總是一個(gè)后向引用, 并且如果在模式中沒(méi)有足夠多的捕獲組,將會(huì )引發(fā)一個(gè)錯誤。換而言之, 被引用的括號不能少于被引用的小于 10 的數量。 A "forward back reference" can make sense when a repetition is involved and the subpattern to the right has participated in an earlier iteration. 查看上面的”反斜線(xiàn)”部分查看具體的數字處理方式。
一個(gè)后向引用會(huì )直接匹配被引用捕獲組在目標字符串中實(shí)際捕獲到的內容,
而不是匹配子組模式的內容。因此,模式
(sens|respons)e and \1ibility
將會(huì )匹配 ”sense and sensibility” 和 ”response and responsibility”,
而不會(huì )匹配 ”sense and responsibility”。
如果在后向引用時(shí)被強制進(jìn)行了大小寫(xiě)敏感匹配,
比如
((?i)rah)\s+\1
匹配 ”rah
rah”和”RAH RAH”,但是不會(huì )匹配 ”RAH rah”,
即使原始捕獲子組自身是不區分大小寫(xiě)的。 譯注:
這里其實(shí)要考慮的是后向引用期望得到的內容是和那個(gè)被引用的捕獲子組得到的內容是完全一致的(當然,
我們可以通過(guò)在后向引用之前設定內部選項使其不區分大小寫(xiě),或者增加模式修飾符,
同樣可以達到不區分大小寫(xiě)的目的,但是,
這種做法實(shí)際上是從外部對其行為進(jìn)行了控制。)
可能會(huì )有超過(guò)一個(gè)的后向引用引用相同的子組。
一個(gè)子組可能并不會(huì )真正的用于特定的匹配,此時(shí),
任何對這個(gè)子組的后向引用也都會(huì )失敗。 比如,
模式
(a|(bc))\2
總是在匹配 ”a” 開(kāi)頭而不是 ”bc” 開(kāi)頭的字符串時(shí)失敗。
因為可能會(huì )有多達 99 個(gè)后向引用,
所有緊跟反斜線(xiàn)后的數字都可能是一個(gè)潛在的后向引用計數。
如果模式在后向引用之后緊接著(zhù)還是一個(gè)數值字符,
那么必須使用一些分隔符用于終結后向引用語(yǔ)法。 如果設置了 PCRE_EXTENDED 選項,
可以使用空格來(lái)做。其他情況下可以使用一個(gè)空的注釋。
如果一個(gè)后向引用出現在它所引用的子組內部, 它的匹配就會(huì )失敗。比如,
(a\1) 就不會(huì )得到任何匹配。然而這種引用可以用于內部的子模式重復。比如,
模式
(a|b\1)+
會(huì )匹配任意數量的 ”a” 組成的字符串以及 ”aba”, “ababba” 等等(譯注:
因為子組內部有一個(gè)可選路徑,可選路徑中有一條路能夠完成匹配,在匹配完成后,
后向引用就能夠引用到內容了)。在每次子模式的迭代過(guò)程中,
后向引用匹配上一次迭代時(shí)這個(gè)子組匹配到的字符串。為了做這種工作,
模式必須滿(mǎn)足這樣一個(gè)條件,模式在第一次迭代的時(shí)候,
必須能夠保證不需要匹配后向引用。
這種條件可以像上面的例子用可選路徑來(lái)實(shí)現,也可以通過(guò)使用最小值為 0
的量詞修飾后向引用的方式來(lái)完成。
轉義序列 \g
可以用于子模式的絕對引用和相對引用。
這個(gè)轉義序列必須緊跟一個(gè)無(wú)符號數字或一個(gè)負數,
可以選擇性的使用括號對數字進(jìn)行包裹。 序列\1
,
\g1
,\g{1}
之間是同義詞關(guān)系。
這種用法可以消除使用反斜線(xiàn)緊跟數值描述反向引用時(shí)候產(chǎn)生的歧義。
這種轉義序列有利于區分后向引用和八進(jìn)制數字字符,
也使得后向引用后面緊跟一個(gè)原文匹配數字變的更明了,比如
\g{2}1
。
\g
轉義序列緊跟一個(gè)負數代表一個(gè)相對的后向引用。比如:
(foo)(bar)\g{-1}
可以匹配字符串 ”foobarbar”,
(foo)(bar)\g{-2}
可以匹配 ”foobarfoo”。
這在長(cháng)的模式中作為一個(gè)可選方案,
用來(lái)保持對之前一個(gè)特定子組的引用的子組序號的追蹤。
后向引用也支持使用子組名稱(chēng)的語(yǔ)法方式描述:
(?P=name)
、\k<name>
、
\k’name’
、\k{name}
、
\g{name}
、\g<name>
、
\g'name'
。