PHP擴(kuò)展之文本處理(二)——PCRE正則表達(dá)式語(yǔ)法13——條件子組
可以使匹配器根據(jù)一個(gè)斷言的結(jié)果, 或者之前的一個(gè)捕獲子組是否匹配來(lái)?xiàng)l件式的匹配一個(gè)子組或者在兩個(gè)可選子組中選擇。 條件子組的兩種語(yǔ)法如下:
(?(condition)yes-pattern)(?(condition)yes-pattern|no-pattern)
如果條件滿足,使用 yes-pattern,其他情況使用 no-pattern(如果指定了)。 如果有超過(guò) 2 個(gè)的可選子組,會(huì)產(chǎn)生給一個(gè)編譯期錯(cuò)誤。
條件一共有兩種。如果在(condition)的括號(hào)內(nèi)是數(shù)字組成的文本, 條件在該數(shù)字代表的(之前的)子組得到匹配時(shí)滿足(即使用 yes-pattern)。 考慮下面的模式, 為了使其易于閱讀其中增加了一些空白字符(查看PCRE_EXTENDED?選項(xiàng))并且將其分為三個(gè)部分:?( ( )? [^()]+ (?(1) ) )
模式的第一部分匹配一個(gè)可選的左括號(hào),并且如果該字符出現(xiàn), 設(shè)置其為第一個(gè)子組的捕獲子串。第二部分匹配一個(gè)或多個(gè)非括號(hào)字符。 第三部分是一個(gè)條件子組,它會(huì)測(cè)試第一個(gè)子組是否匹配,如果匹配到了, 也就是說(shuō)目標(biāo)字符串以左括號(hào)開(kāi)始,條件為TRUE, 那么使用 yes-pattern 也就是這里需要匹配一個(gè)右括號(hào)。其他情況下, 既然 no-pattern 沒(méi)有出現(xiàn),這個(gè)子組就不匹配任何東西。換句話說(shuō), 這個(gè)模式匹配一個(gè)沒(méi)有括號(hào)的或者閉合括號(hào)包裹的字符序列。
如果條件式字符串?(R),它在得到對(duì)模式或子模式的遞歸調(diào)用時(shí)滿足。 在”最上級(jí)”, 條件總是false。
如果條件不是數(shù)字序列或(R),它就必須是一個(gè)斷言。這里的斷言可以使任意的,積極, 消極,正向,后向都是可以的。考慮這個(gè)模式, 同樣為了方便閱讀, 增加了一些空白字符,并且在第二行有兩個(gè)可選路徑。
(?(?=[^a-z]*[a-z])d{2}-[a-z]{3}-d{2} | d{2}-d{2}-d{2} )
條件式一個(gè)正向積極斷言,匹配一個(gè)可選的非小寫(xiě)字母字符序列緊接著一個(gè)小寫(xiě)字母。 換一種說(shuō)法,它測(cè)試目標(biāo)中至少出現(xiàn)一個(gè)小寫(xiě)字母,如果小寫(xiě)字母發(fā)現(xiàn), 目標(biāo)匹配第一個(gè)可選分支,其他情況下它匹配第二個(gè)分支。 這個(gè)模式匹配兩種格式的字符串:dd-aaa-dd 或 dd-dd-dd。aaa 代表小寫(xiě)字母, dd 是數(shù)字。
相關(guān)文章:
1. xml文件的結(jié)構(gòu)解讀第1/2頁(yè)2. jsp實(shí)現(xiàn)局部刷新頁(yè)面、異步加載頁(yè)面的方法3. Jsp中request的3個(gè)基礎(chǔ)實(shí)踐4. SSM框架整合JSP中集成easyui前端ui項(xiàng)目開(kāi)發(fā)示例詳解5. python線性插值解析6. PHP連接MySQL數(shù)據(jù)庫(kù)操作代碼實(shí)例解析7. Python requests模塊session代碼實(shí)例8. JSP 中request與response的用法詳解9. 詳解java CountDownLatch和CyclicBarrier在內(nèi)部實(shí)現(xiàn)和場(chǎng)景上的區(qū)別10. python文件讀取失敗怎么處理
