PHP擴(kuò)展之文本處理(二)——PCRE正則表達(dá)式語(yǔ)法8——子組(子模式)
子組通過(guò)圓括號(hào)分隔界定,并且它們可以嵌套。 將一個(gè)模式中的一部分標(biāo)記為子組(子模式)主要是來(lái)做兩件事情:
將可選分支局部化。比如,模式cat(arcat|erpillar|)匹配 ”cat”, “cataract”, “caterpillar” 中的一個(gè),如果沒(méi)有圓括號(hào)的話(huà),它匹配的則是 ”cataract”, “erpillar” 以及空字符串。將子組設(shè)定為捕獲子組(向上面定義的). 當(dāng)整個(gè)模式匹配后, 目標(biāo)字符串中匹配子組的部分將會(huì)通過(guò)?pcre_exec()()?的?ovector?參數(shù)回傳給調(diào)用者。 左括號(hào)從左至右出現(xiàn)的次序就是對(duì)應(yīng)子組的下標(biāo)(從 1 開(kāi)始), 可以通過(guò)這些下標(biāo)數(shù)字來(lái)獲取捕獲子模式匹配結(jié)果。比如,如果字符串 ”the red king” 使用模式((red|white) (king|queen))?進(jìn)行匹配, 模式匹配到的結(jié)果是 array(“red king”, ”red king”, “red”, “king”) 的形式, 其中第 0 個(gè)元素是整個(gè)模式匹配的結(jié)果,后面的三個(gè)元素依次為三個(gè)子組匹配的結(jié)果。 它們的下表分別為 1, 2, 3。
事實(shí)上,圓括號(hào)履行的兩種功能并不總是有用的。 經(jīng)常我們會(huì)有一種需求需要使用子組進(jìn)行分組, 但又不需要(單獨(dú)的)捕獲它們。 在子組定義的左括號(hào)后面緊跟字符串 ”?:” 會(huì)使得該子組不被單獨(dú)捕獲, 并且不會(huì)對(duì)其后子組序號(hào)的計(jì)算產(chǎn)生影響。比如, 如果字符串 ”the white queen” 匹配模式?((?:red|white) (king|queen)),匹配到的結(jié)果會(huì)是 array(“white queen”、“white queen”、“white queen”),的和 king|queen 這兩個(gè)子組。 捕獲子組序號(hào)的最大值是 99, 最大允許擁有的所有子組(包括捕獲的和非捕獲的)的最大數(shù)量為 200。
為了方便簡(jiǎn)寫(xiě),如果需要在非捕獲子組開(kāi)始位置設(shè)置選項(xiàng), 選項(xiàng)字母可以位于 ? 和 : 之間,比如:
(?i:saturday|sunday)(?:(?i)saturday|sunday)
上面兩種寫(xiě)法實(shí)際上是相同的模式。因?yàn)榭蛇x分支會(huì)從左到右嘗試每個(gè)分支, 并且選項(xiàng)沒(méi)有在子模式結(jié)束前被重置, 并且由于選項(xiàng)的設(shè)置會(huì)穿透對(duì)后面的其他分支產(chǎn)生影響,因此, 上面的模式都會(huì)匹配 ”SUNDAY” 以及 ”Saturday”。
在 PHP 4.3.3 中,可以對(duì)子組使用?(?P<name>pattern)?的語(yǔ)法進(jìn)行命名。 這個(gè)子模式將會(huì)在匹配結(jié)果中同時(shí)以其名稱(chēng)和順序(數(shù)字下標(biāo))出現(xiàn), PHP 5.2.2中又增加了兩種味子組命名的語(yǔ)法:?(?<name>pattern)?和?(?’name’pattern)。
有時(shí)需要多個(gè)匹配可以在一個(gè)正則表達(dá)式中選用子組。 為了讓多個(gè)子組可以共用一個(gè)后向引用數(shù)字的問(wèn)題,?(?|?語(yǔ)法允許復(fù)制數(shù)字。 考慮下面的正則表達(dá)式匹配Sunday:
(?:(Sat)ur|(Sun))day
這里當(dāng)后向引用 1 空時(shí)Sun?存儲(chǔ)在后向引用 2 中. 當(dāng)后向引用 2 不存在的時(shí)候?Sat?存儲(chǔ)在后向引用 1中。 使用?(?|修改模式來(lái)修復(fù)這個(gè)問(wèn)題:
(?|(Sat)ur|(Sun))day
使用這個(gè)模式,?Sun和Sat都會(huì)被存儲(chǔ)到后向引用1中。
相關(guān)文章:
1. python b站視頻下載的五種版本2. python 批量下載bilibili視頻的gui程序3. Python實(shí)現(xiàn)查找數(shù)據(jù)庫(kù)最接近的數(shù)據(jù)4. CSS自定義滾動(dòng)條樣式案例詳解5. python鏈表類(lèi)中獲取元素實(shí)例方法6. ASP基礎(chǔ)入門(mén)第三篇(ASP腳本基礎(chǔ))7. python中if嵌套命令實(shí)例講解8. 如何用python插入獨(dú)創(chuàng)性聲明9. 使用css實(shí)現(xiàn)全兼容tooltip提示框10. 詳解CSS不定寬溢出文本適配滾動(dòng)
