正規表示式 環視(零寬斷言)

2021-08-28 05:40:52 字數 1096 閱讀 6634

環視

也叫零寬斷言

它匹配的是乙個位置,該位置必須滿足零寬斷言條件,才能繼續往下進行匹配。

由於位置不是字元,它是沒有寬度的,所以叫做零寬斷言。

環視分為4種情況,概念是想通的,用哪種需要根據自己的需求來決定:

否定逆序環視(?否定逆序環視:在這個位置的前邊(逆序),不能有(否定)條件給出的字串

肯定逆序環視:在這個位置的前邊(逆序),必須是(肯定)條件給出的字串

否定順序環視:在這個位置的後邊(順序),不能有(否定)條件給出的字串

肯定順序環視,在這個位置的後邊(順序),必須是(肯定)條件給出的字串

舉例1234567890

比如給這一串數字轉為英文的寫法,需要每三位加乙個逗號。

那麼我們就需要找到這樣的位置。

這個位置有什麼規律呢,每個逗號後邊必須有3的倍數個數字,且個位數字後不能有逗號,那麼可以這麼寫:

(?=(\d\d\d)+\b)
表示需要3個數字這樣的組合,至少出現1次,最後是單詞的分界符。

注意零寬斷言,並沒有真的匹配,環視的意思可以這麼理解,即匹配前先看一看,看前/後是否滿足條件,然後再決定當前位置時候合適開始匹配,環視時正則引擎並不傳動。

我們可以進行替換,在 notepad++ 中,可以這樣進行替換,如圖:

這裡有個問題,比如剛好是3的倍數字數字會出現什麼情況,比如對於 9 位長度的:

123456789
我們替換後,出現

,123,456,789
說明不夠完備,我們需要考慮逗號的前邊是必須要有數字的,這裡即「逆序肯定」

(?<=\d)
表示位置左邊的字元,需要是乙個數字,這樣的位置才滿足要求。

我們上邊的兩個條件合起來,即需要共同滿足這兩個條件的位置:

(?<=\d)(?=(\d\d\d)+\b)
這裡多個條件的順序無所謂,和乘法一樣,誰前誰後不影響結果。

正規表示式 零寬斷言

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

正規表示式 零寬斷言

今天在codewars.com做練習,遇到乙個正規表示式相關的題目regex password validation 題目很簡單,對字串進行校驗,規則如下 1.長度至少有6位 2.包含小寫字母 3.包含大寫字母 4.包含數字 5.僅由數字和字母組成 對於2.3.4這3個條件,沒辦法寫在乙個正則裡面,...

正規表示式 零寬斷言

接下來的四個用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b 那樣用於指定乙個位置,這個位置應該滿足一定的條件 斷言 因此它們也被稱為零寬斷言。最好還是拿例子來說明吧 exp 也叫零寬度正 先行斷言,它斷言自身出現的位置的後面能匹配表示式exp 比如 b w ing b ...