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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2024/9/18 php 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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正则表达式环视详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。