正規表示式 零寬斷言

2021-08-20 22:24:31 字數 775 閱讀 1513

今天在codewars.com做練習,遇到乙個正規表示式相關的題目regex password validation

題目很簡單,對字串進行校驗,規則如下:

1.長度至少有6位

2.包含小寫字母

3.包含大寫字母

4.包含數字

5.僅由數字和字母組成

對於2.3.4這3個條件,沒辦法寫在乙個正則裡面,於是搜尋發現了零寬斷言這種正則形式,這種形式是以括號包起來的子表示式存在的,由以下兩種形式:

所謂零寬斷言,其實語義上分兩部分:零寬就是指這個括號內的正規表示式長度位零,不用作正則提取;斷言就是指這是乙個判斷語句類似與if。

回到剛才的題目,答案可以這麼寫:

regex = '^(?=.*?[0-9])(?=.*?[a-z])(?=.*?[a-z])[0-9a-za-z]$'

^後的3個括號的意思分別是包含數字,包含小寫字母,包含大寫字母

雖然答案通過了,但是還是覺得不對勁,按照以前的正則知識,正則是有順序的,^後的3個括號體現出來的順序應該是 數字-小寫字母-大寫字母,但是事實上正則並沒有按照這種順序解釋,於是又回到零寬這個屬性上來,既然是"零寬"的,那麼單獨看這3個括號中的任意乙個括號時,其它兩個括號都是零寬即可以忽略的,也就是說他們之間是互不影響的,這一點純屬個人理解,如果有不對,歡迎指正。

這個題不適合用負向零寬斷言,不過稍微變通一下還是能寫出來的:

regex = '^(?![0-9a-z]+$)(?![a-za-z]+$)(?![0-9a-z]+$)[0-9a-za-z]$'

正規表示式 零寬斷言

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

正規表示式 零寬斷言

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

正規表示式零寬斷言

匹配後面為 path,結果為product product path scan product path 匹配前面為name 結果為wangfei name wangfei scan name wangfei 匹配後面不是 path product path scan product path 匹配...