正規表示式 預搜尋(零寬斷言)詳解

2021-08-30 08:41:59 字數 1867 閱讀 7259

零寬斷言的意思是(匹配寬度為零,滿足一定的條件/斷言) 我也不知道這個詞語是那個王八蛋發明的,簡直是太拗口了。

零寬斷言用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b ^ $ \< \>這樣的錨定作用,僅僅用於指定乙個位置,不參與內容匹配,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。 斷言用來宣告乙個應該為真的事實。正規表示式中只有當斷言為真時才會繼續進行匹配。

其中零寬斷言又分四種:

(?=表示式) 零寬度正向先行斷言 表示匹配表示式前面的位置

例如,要匹配 cooking ,singing ,doing中除了ing之外的內容,只取cook, sing, do的內容,這時候的增則表示式可以用[a-z]*(?=ing)來匹配

注意:先行斷言的執行步驟是這樣的先從要匹配的字串中的最右端找到第乙個 ing (也就是先行斷言中的表示式)然後 再匹配其前面的表示式,若無法匹配則繼續查詢第二個 ing 再匹配第二個 ing 前面的字串,若能匹配則匹配,符合正則的貪婪性。

例如:.*(?=ing)可以匹配 「cooking singing」 中的 「cooking sing」 而不是 cook

(?<=表示式) 零寬度正向後行斷言 表示匹配表示式後面的位置

例如(?<=abc).*可以匹配 abcdefg 中的 defg

注意:後發斷言跟先行斷言恰恰相反 它的執行步驟是這樣的:先從要匹配的字串中的最左端找到第乙個abc(也就是先行斷言中的表示式)然後 再匹配其後面的表示式,若無法匹配則繼續查詢第二個 abc 再匹配第二個 abc 後面的字串,若能匹配則匹配。

例如(?<=abc).*可以匹配 abcdefgabc 中的 defgabc 而不是 abcdefg

(?!表示式) 零寬度負向先行斷言

負向零寬斷言(?!exp)也是匹配乙個零寬度的位置,不過這個位置的「斷言」取表示式的反值,例如 (?!exp) 表示 「exp」 前面的位置,如果 「exp」 不成立 ,匹配這個位置;如果 「exp」 成立,則不匹配。

同樣,負向零寬斷言也有「先行」和「後行」兩種

負向零寬先行斷言為(?!exp)

負向零寬後發斷言為(?

(? 零寬度負向後行斷言

負向零寬斷言要注意的跟正向的一樣。

實戰1:匹配不包含屬性的html標籤裡的內容

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

實戰2:獲取小括號裡面的內容

Java正規表示式 預搜尋(零寬斷言)詳解(精)

零寬斷言的意思是 匹配寬度為零,滿足一定的條件 斷言 我也不知道這個詞語是那個王八蛋發明的,簡直是太拗口了。零寬斷言用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b 這樣的錨定作用,僅僅用於指定乙個位置,不參與內容匹配,這個位置應該滿足一定的條件 即斷言 因此它們也被稱為...

正規表示式 零寬斷言詳解

零寬斷言的意思是 匹配寬度為零,滿足一定的條件 斷言 我也不知道這個詞語是那個王八蛋發明的,簡直是太拗口了。零寬斷言用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b,那樣用於指定乙個位置,這個位置應該滿足一定的條件 即斷言 因此它們也被稱為零寬斷言。斷言用來宣告乙個應該為...

正規表示式 零寬斷言詳解

零寬斷言的意思是 匹配寬度為零,滿足一定的條件 斷言 我也不知道這個詞語是那個王八蛋發明的,簡直是太拗口了。零寬斷言用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b,那樣用於指定乙個位置,這個位置應該滿足一定的條件 即斷言 因此它們也被稱為零寬斷言。斷言用來宣告乙個應該為...