正規表示式中的「負向零寬」

2021-06-21 23:50:37 字數 928 閱讀 7004

如果我們只是想要確保某個字元沒有出現,但並不想去匹配它時怎麼辦?例如,如果我們想查詢這樣的單詞--它裡面出現了字母q,但是q後面跟的不是字母u,我們可以嘗試這樣:

\b\w*q[^u]\w*\b匹配包含後面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出單詞的結尾的話,像iraq,benq,這個表示式就會出錯。這是因為[^u]總要匹配乙個字元,所以如果q是單詞的最後乙個字元的話,後面的[^u]將會匹配q後面的單詞分隔符(可能是空格,或者是句號或其它的什麼),後面的\w*\b將會匹配下乙個單詞,於是\b\w*q[^u]\w*\b就能匹配整個iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配乙個位置,並不消費任何字元。,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。

零寬度負**先行斷言(?!exp),斷言此位置的後面不能匹配表示式exp。例如:\d(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。

同理,我們可以用(?請詳細分析表示式(?<=<(\w+)>).*(?=<\/\1>),這個表示式最能表現零寬斷言的真正用途。

乙個更複雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單html標籤內裡的內容。(?<=<(\w+)>)指定了這樣的字首:被尖括號括起來的單詞(比如可能是),然後是.*(任意的字串),最後是乙個字尾(?=<\/\1>)。注意字尾裡的\/,它用到了前面提過的字元轉義,將」/「轉義;\1則是乙個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果字首實際上是的話,字尾就是了。整個表示式匹配的是之間的內容(再次提醒,不包括字首和字尾本身)。

正規表示式中的零寬斷言

零寬斷言 地球人,是不是覺得這些術語名稱太複雜,太難記了?我也和你一樣。知道有這麼一種東西就行了,它叫什麼,隨它去吧!無名,萬物之始 接下來的四個用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b,那樣用於指定乙個位置,這個位置應該滿足一定的條件 即斷言 因此它們也被稱為零...

正規表示式中的零寬斷言

在使用正規表示式時,有時我們需要捕獲的內容前後必須是特定的內容,但又不捕獲這些特定的內容,這個時候就要使用零寬斷言了。零寬斷言和它的名字一樣,是一種零寬度的匹配,它匹配的內容不會儲存到結果中去,最終匹配結果只是乙個位置而已。零寬斷言是給指定位置新增乙個限定條件,用來規定此位置之前或者之後必須滿足限定...

正規表示式中的零寬斷言

我們利用領款斷言,是要去匹配乙個特定的位置的,並不難以理解。exp 也叫零寬度正 先行斷言,它斷言自身出現的位置的後面能匹配表示式exp。比如 b re w b,匹配以re開頭的單詞,如查詢reading a book.時,它會匹配reading d d b,用它對1234567890進行查詢時結果...