久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP擴(kuò)展之文本處理(二)——PCRE正則表達(dá)式語法11——斷言

瀏覽:45日期:2022-09-16 08:25:14

一個(gè)斷言就是一個(gè)對(duì)當(dāng)前匹配位置之前或之后的字符的測試, 它不會(huì)實(shí)際消耗任何字符。簡單的斷言代碼有b、B、 A、 Z、z、 ^、$ 等等。 更加復(fù)雜的斷言以子組的方式編碼。 它有兩種類型:前瞻斷言(從當(dāng)前位置向前測試)和后瞻斷言(從當(dāng)前位置向后測試)。

一個(gè)斷言子組的匹配還是通過普通方式進(jìn)行的, 不同在于它不會(huì)導(dǎo)致當(dāng)前的匹配點(diǎn)發(fā)生改變。?前瞻斷言中的正面斷言(斷言此匹配為真)以 ”(?=” 開始,消極斷言以 ”(?!” 開頭。比如,?w+(?=;)?匹配一個(gè)單詞緊跟著一個(gè)分號(hào)但是匹配結(jié)果不會(huì)包含分號(hào),?foo(?!bar)?匹配所有后面沒有緊跟 ”bar” 的 ”foo” 字符串。 注意一個(gè)類似的模式?(?!foo)bar, 它不能用于查找之前出現(xiàn)所有不是 ”foo” 的 ”bar” 匹配, 它會(huì)查找到任意的 ”bar” 出現(xiàn)的情況, 因?yàn)?(?!foo) 這個(gè)斷言在接下來三個(gè)字符時(shí) ”bar” 的時(shí)候是永遠(yuǎn)都?TRUE?的。 前瞻斷言需要達(dá)到的就是這樣的效果。

后瞻斷言中的正面斷言以”(?<=”開始, 消極斷言以”(?<!”開始。比如,?(?<!foo)bar?用于查找任何前面不是 ”foo” 的 ”bar”。 后瞻斷言的內(nèi)容被嚴(yán)格限制為只能用于匹配定長字符串。但是,如果有多個(gè)可選分支, 它們不需要擁有相同的長度。比如?(?<=bullock|donkey)?是允許的, 但是?(?<!dogs?|cats?)?將會(huì)引發(fā)一個(gè)編譯期的錯(cuò)誤。在最上級(jí)分支可以匹配不同長度的字符串是允許的。 相比較于 perl 5.005 而言,它會(huì)要求多個(gè)分支使用相同長度的字符串匹配。(?<=ab(c|de))?這樣的斷言是不允許的, 因?yàn)樗鼏蝹€(gè)的頂級(jí)分支可以匹配兩個(gè)不同的長度, 但是它可以接受使用兩個(gè)頂級(jí)分支的寫法?(?<=abc|abde)?這樣的斷言實(shí)現(xiàn), 對(duì)于每個(gè)可選分支,暫時(shí)將當(dāng)前位置移動(dòng)到嘗試匹配的當(dāng)前位置之前的固定寬度處。 如果在當(dāng)前沒有足夠的字符就視為匹配失敗。后瞻斷言與一次性子組結(jié)合使用可以用來匹配字符串結(jié)尾; 一個(gè)例子就是在一次性子組上給出字符串結(jié)尾。

多個(gè)斷言(任意順序)可以同時(shí)出現(xiàn)。 比如?(?<=d{3})(?<!999)foo?匹配前面有三個(gè)數(shù)字但不是 ”999” 的字符串 ”foo”。注意, 每個(gè)斷言獨(dú)立應(yīng)用到對(duì)目標(biāo)字符串該點(diǎn)的匹配。 首先它會(huì)檢查前面的三位都是數(shù)字, 然后檢查這三位不是 ”999”。 這個(gè)模式不能匹配 ”foo” 前面有三位數(shù)字然后緊跟 3 位非 999 共 6 個(gè)字符的字符串,比如, 它不匹配 ”123abcfoo”。 匹配 ”123abcfoo” 這個(gè)字符串的模式可以是(?<=d{3}…)(?<!999)foo。

這種情況下,第一個(gè)斷言查看(當(dāng)前匹配點(diǎn))前面的 6 個(gè)字符,檢查前三個(gè)是數(shù)字, 然后第二個(gè)斷言檢查(當(dāng)前匹配點(diǎn))前三個(gè)字符不是 ”999”。

斷言可以以任意復(fù)雜度嵌套。 比如?(?<=(?<!foo)bar)baz?匹配前面有 ”bar” 但是 ”bar” 前面沒有 ”foo” 的 ”baz”。 另外一個(gè)模式?(?<=d{3}…(?<!999))foo?則匹配前面有三個(gè)數(shù)字字符緊跟 3 個(gè)不是 999 的任意字符的 ”foo”。

斷言子組時(shí)非捕獲子組,并且不能用量詞修飾, 因?yàn)閷?duì)同一件事做多次斷言是沒有意義的.如果所有的斷言都包含一個(gè)捕獲子組, 那么為了在整個(gè)模式中捕獲子組計(jì)數(shù)的目的,它們都會(huì)被計(jì)算在內(nèi)。然而, 子字符串的捕獲僅可以用于正面斷言,因?yàn)閷?duì)于消極的斷言是沒有意義的。

將斷言計(jì)算在內(nèi),可以擁有的最大子組數(shù)量是 200 個(gè)。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 宁海县| 航空| 剑阁县| 托里县| 报价| 泗洪县| 阿拉尔市| 穆棱市| 西和县| 青川县| 托克逊县| 上高县| 赤峰市| 中山市| 辽宁省| 晴隆县| 八宿县| 连江县| 阿图什市| 沈阳市| 定南县| 黄平县| 甘肃省| 高清| 曲阜市| 金沙县| 建德市| 东乌珠穆沁旗| 临海市| 张北县| 增城市| 云安县| 文昌市| 伊春市| 合作市| 金寨县| 宣化县| 星子县| 营口市| 涟源市| 上杭县|