php 正则表达式 环视,php正则表达式环视详解
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)題。
- 上一篇: 怎样把手机变成路由器怎么让手机变成wif
- 下一篇: php 从字符中随机挑一个数,php 对