php 正则表达式 环视,php正则表达式环视详解
php正則表達式環視詳解
1. 順序肯定環視(?=exp)
零寬度正預測先行斷言,又稱順序肯定環視,斷言自身出現位置的后面能匹配表達式exp。
比如,匹配以“ing”結尾的單詞前面部分(除了“ing”以外的部分):
bw+(?=ingb)
以上表達式查找以下句子時,會匹配“sing”和“danc”:
I'm singing while you're dancing.
2. 逆序肯定環視(?<=exp)
零寬度正回顧后發斷言,又稱逆序肯定環視,斷言自身出現位置的前面能匹配表達式exp。
比如,以re開頭的單詞的后半部分(除了re以外的部分):
(?<=bre)w+b
以上表達式在查找以下句子時匹配“ading”:
reading a book
假如在很長的數字中,每3位間加1個逗號(當然是從右邊加起),可以在前面和里面添加逗號的部分:
((?<=d)d{3})+b
用以上表達式對“1234567890”進行查找,結果是“,234,567,890”。這里的逗號只是匹配需要添加逗號的位置,還沒有實際添加逗號。
下面這個例子同時使用這兩種斷言,匹配以空白符間隔的數字(再次強調,不包括這些空白符):
(?<=s)d+(?=s)
前面提到過反義,用來查找不是某個字符或不在某個字符類里的字符。如果只是想要確保某個字符沒有出現,但并不想去匹配它時怎么辦?例如,如果想查找這樣的單詞——出現字母q,但是q后面跟的不是字母u。可以嘗試這樣:
bw*q[^u]w*b
以上表達式匹配包含后面不是字母u的字母q的單詞。但是如果多做幾次測試就會發現,如果q出現在單詞的結尾,例如Iraq、Benq,這個表達式就會出錯。這是因為[^u]總要匹配一個字符,如果q是單詞的最后一個字符,后面的“[^u]”將會匹配q后面的單詞分隔符(可能是空格、句號或其他),后面的“w*b”將會匹配下一個單詞,于是以上表達式就能匹配整個Iraq fighting。
逆序肯定環視能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。現在,解決這個問題如下所示:
bw*q(?!u)w*b
3. 順序否定環視(?!exp)
零寬度負預測先行斷言,又稱順序否定環視,斷言此位置的后面不能匹配表達式“exp”。例如:
1)匹配3位數字,而且這3位數字的后面不能是數字:
d{3}(?!d)
2)匹配不包含連續字符串abc的單詞:
b((?!abc)w)+b
如果匹配的單詞是c開頭、t結尾,中間有一個字符,但不能是u(也就是說,整個單詞不能是cut),直接用“c[^u]t”就可以了,若中間的字符不能是a或u(也就是說,整個單詞不能是cat或cut),則表達式改為“c[^au]t”。
如果認真讀過關于排除型字符組的章節的讀者肯定會知道,這個表達式能匹配的只是cot之類的單詞,因為中間的排除型字符組“[^au]”必須匹配一個字符。可是,如果還想匹配chart、conduct和court怎么辦?最簡單的想法是:去掉排除型字符組的長度限制,改成“c[^au]+t”。
不幸的是,這樣行不通,因為這個表達式的意思是:c和t之間由多于一個“除a或u之外的字符”構成,而chart、conduct和court都包含a或u。
我們發現,其實要否定的是“單個出現的a或u”,而不僅僅是“出現的a或u”,所以才出現這樣的問題。要解決這個問題,就應當把意思準確表達出來,變成“在結尾的t之前,不允許只出現一個a或u”。想到這一步,就可以用順序否定環視(?!…)來解決。表示在這個位置向右,不允許出現子表達式能夠匹配的文本,把子表達式規定為“[au]tb”(最后的“b”很重要,它出現在t之后,保證t是單詞的結尾字母)。有了限制,匹配a和t之間文本的表達式就隨意很多,可以用匹配單詞字符的簡記法“w”表示,于是整個表達式變成:
c(?![au]t b)w+t
注意 這里出現的并不是排除型字符組“[^au]”,而是普通的字符組[au],因為順序否定環視本身已經表示了否定。
進一步思考,整個匹配文本中都不能出現字符串“cat”,要怎么辦呢?這個正則表達式應該是:
^(?:(?!cat).)+$
即在文本中的任意位置,都不能出現該字符串。
4. 逆序否定環視(?
零寬度負回顧后發斷言,又稱逆序否定環視,可以用(?
(?
分析以下表達式,匹配不包含屬性的簡單HTML標簽內的內容:
(?<=).*(?=1>)
以上表達式最能表現零寬斷言的真正用途。((w+)>)指定前綴為:被尖括號括起來的單詞(比如可能是“”),然后是“.*”(任意的字符串),最后是一個后綴(?=1>)。注意后綴里的“/”,用到了前面提過的字符轉義;“1”則是反向引用,引用的正是捕獲的第一組,即前面(w+)匹配的內容,如果前綴實際上是“”,后綴就是“”。整個表達式匹配的是“”和“”之間的內容(再次提醒,不包括前綴和后綴本身)。
總體而言,環視相當于對“所在位置”附加一個條件,難點就在于找到這個“位置”。這一點解決了,環視就沒有什么秘密可言了。
總結
以上是生活随笔為你收集整理的php 正则表达式 环视,php正则表达式环视详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样把手机变成路由器怎么让手机变成wif
- 下一篇: 输卵管不通畅哪里医院治