日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php 正则表达式 环视,php正则表达式环视详解

發(fā)布時(shí)間:2024/9/18 php 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 正则表达式 环视,php正则表达式环视详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

php正則表達(dá)式環(huán)視詳解

1. 順序肯定環(huán)視(?=exp)

零寬度正預(yù)測(cè)先行斷言,又稱順序肯定環(huán)視,斷言自身出現(xiàn)位置的后面能匹配表達(dá)式exp。

比如,匹配以“ing”結(jié)尾的單詞前面部分(除了“ing”以外的部分):

bw+(?=ingb)

以上表達(dá)式查找以下句子時(shí),會(huì)匹配“sing”和“danc”:

I'm singing while you're dancing.

2. 逆序肯定環(huán)視(?<=exp)

零寬度正回顧后發(fā)斷言,又稱逆序肯定環(huán)視,斷言自身出現(xiàn)位置的前面能匹配表達(dá)式exp。

比如,以re開(kāi)頭的單詞的后半部分(除了re以外的部分):

(?<=bre)w+b

以上表達(dá)式在查找以下句子時(shí)匹配“ading”:

reading a book

假如在很長(zhǎng)的數(shù)字中,每3位間加1個(gè)逗號(hào)(當(dāng)然是從右邊加起),可以在前面和里面添加逗號(hào)的部分:

((?<=d)d{3})+b

用以上表達(dá)式對(duì)“1234567890”進(jìn)行查找,結(jié)果是“,234,567,890”。這里的逗號(hào)只是匹配需要添加逗號(hào)的位置,還沒(méi)有實(shí)際添加逗號(hào)。

下面這個(gè)例子同時(shí)使用這兩種斷言,匹配以空白符間隔的數(shù)字(再次強(qiáng)調(diào),不包括這些空白符):

(?<=s)d+(?=s)

前面提到過(guò)反義,用來(lái)查找不是某個(gè)字符或不在某個(gè)字符類(lèi)里的字符。如果只是想要確保某個(gè)字符沒(méi)有出現(xiàn),但并不想去匹配它時(shí)怎么辦?例如,如果想查找這樣的單詞——出現(xiàn)字母q,但是q后面跟的不是字母u??梢試L試這樣:

bw*q[^u]w*b

以上表達(dá)式匹配包含后面不是字母u的字母q的單詞。但是如果多做幾次測(cè)試就會(huì)發(fā)現(xiàn),如果q出現(xiàn)在單詞的結(jié)尾,例如Iraq、Benq,這個(gè)表達(dá)式就會(huì)出錯(cuò)。這是因?yàn)?#xff3b;^u]總要匹配一個(gè)字符,如果q是單詞的最后一個(gè)字符,后面的“[^u]”將會(huì)匹配q后面的單詞分隔符(可能是空格、句號(hào)或其他),后面的“w*b”將會(huì)匹配下一個(gè)單詞,于是以上表達(dá)式就能匹配整個(gè)Iraq fighting。

逆序肯定環(huán)視能解決這樣的問(wèn)題,因?yàn)樗黄ヅ湟粋€(gè)位置,并不消費(fèi)任何字符?,F(xiàn)在,解決這個(gè)問(wèn)題如下所示:

bw*q(?!u)w*b

3. 順序否定環(huán)視(?!exp)

零寬度負(fù)預(yù)測(cè)先行斷言,又稱順序否定環(huán)視,斷言此位置的后面不能匹配表達(dá)式“exp”。例如:

1)匹配3位數(shù)字,而且這3位數(shù)字的后面不能是數(shù)字:

d{3}(?!d)

2)匹配不包含連續(xù)字符串a(chǎn)bc的單詞:

b((?!abc)w)+b

如果匹配的單詞是c開(kāi)頭、t結(jié)尾,中間有一個(gè)字符,但不能是u(也就是說(shuō),整個(gè)單詞不能是cut),直接用“c[^u]t”就可以了,若中間的字符不能是a或u(也就是說(shuō),整個(gè)單詞不能是cat或cut),則表達(dá)式改為“c[^au]t”。

如果認(rèn)真讀過(guò)關(guān)于排除型字符組的章節(jié)的讀者肯定會(huì)知道,這個(gè)表達(dá)式能匹配的只是cot之類(lèi)的單詞,因?yàn)橹虚g的排除型字符組“[^au]”必須匹配一個(gè)字符。可是,如果還想匹配chart、conduct和court怎么辦?最簡(jiǎn)單的想法是:去掉排除型字符組的長(zhǎng)度限制,改成“c[^au]+t”。

不幸的是,這樣行不通,因?yàn)檫@個(gè)表達(dá)式的意思是:c和t之間由多于一個(gè)“除a或u之外的字符”構(gòu)成,而chart、conduct和court都包含a或u。

我們發(fā)現(xiàn),其實(shí)要否定的是“單個(gè)出現(xiàn)的a或u”,而不僅僅是“出現(xiàn)的a或u”,所以才出現(xiàn)這樣的問(wèn)題。要解決這個(gè)問(wèn)題,就應(yīng)當(dāng)把意思準(zhǔn)確表達(dá)出來(lái),變成“在結(jié)尾的t之前,不允許只出現(xiàn)一個(gè)a或u”。想到這一步,就可以用順序否定環(huán)視(?!…)來(lái)解決。表示在這個(gè)位置向右,不允許出現(xiàn)子表達(dá)式能夠匹配的文本,把子表達(dá)式規(guī)定為“[au]tb”(最后的“b”很重要,它出現(xiàn)在t之后,保證t是單詞的結(jié)尾字母)。有了限制,匹配a和t之間文本的表達(dá)式就隨意很多,可以用匹配單詞字符的簡(jiǎn)記法“w”表示,于是整個(gè)表達(dá)式變成:

c(?![au]t b)w+t

注意 這里出現(xiàn)的并不是排除型字符組“[^au]”,而是普通的字符組[au],因?yàn)轫樞蚍穸ōh(huán)視本身已經(jīng)表示了否定。

進(jìn)一步思考,整個(gè)匹配文本中都不能出現(xiàn)字符串“cat”,要怎么辦呢?這個(gè)正則表達(dá)式應(yīng)該是:

^(?:(?!cat).)+$

即在文本中的任意位置,都不能出現(xiàn)該字符串。

4. 逆序否定環(huán)視(?

零寬度負(fù)回顧后發(fā)斷言,又稱逆序否定環(huán)視,可以用(?

(?

分析以下表達(dá)式,匹配不包含屬性的簡(jiǎn)單HTML標(biāo)簽內(nèi)的內(nèi)容:

(?<=).*(?=1>)

以上表達(dá)式最能表現(xiàn)零寬斷言的真正用途。((w+)>)指定前綴為:被尖括號(hào)括起來(lái)的單詞(比如可能是“”),然后是“.*”(任意的字符串),最后是一個(gè)后綴(?=1>)。注意后綴里的“/”,用到了前面提過(guò)的字符轉(zhuǎn)義;“1”則是反向引用,引用的正是捕獲的第一組,即前面(w+)匹配的內(nèi)容,如果前綴實(shí)際上是“”,后綴就是“”。整個(gè)表達(dá)式匹配的是“”和“”之間的內(nèi)容(再次提醒,不包括前綴和后綴本身)。

總體而言,環(huán)視相當(dāng)于對(duì)“所在位置”附加一個(gè)條件,難點(diǎn)就在于找到這個(gè)“位置”。這一點(diǎn)解決了,環(huán)視就沒(méi)有什么秘密可言了。

總結(jié)

以上是生活随笔為你收集整理的php 正则表达式 环视,php正则表达式环视详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。