正規表示式學習2 零寬斷言

2021-09-08 12:48:18 字數 2676 閱讀 2436

參考文章:

這篇看起來像是圖書一樣:

當該字元("?")緊跟在任何乙個其他限制符 (*, +, ?, , , ) 後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜尋的字串,而預設的貪婪模式則盡可能多的匹配所搜尋的字串。例如,對於字串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

零寬斷言

(?=exp) 	匹配exp前面的位置

(?<=exp) 匹配exp後面的位置

(?!exp) 匹配後面跟的不是exp的位置

(?(?=exp)

(?=exp)也叫零寬度正**先行斷言,它斷言自身出現的位置的後面能匹配表示式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢i'm singing while you're dancing.時,它會匹配sing和danc。

如果不想匹配符號,只匹配乙個位置,就要用到「零寬斷言」(匹配寬度為零,滿足一定的 條件/斷言),零寬斷言使用 (?=表示式) 的語法,例如\w+(?=。),其中(?=。)表示前面的位置(先行斷言)

要我說,這個可以這麼看:

表示式:exp1(?=exp2),相當於exp1exp2,只是獲取的時候,只拿exp1,而exp2不進入獲取行列。且exp2只要拿到最基礎的乙個匹配就可以了。這裡採用的是非貪婪模式。

當該字元緊跟在任何乙個其他限制符 (*, +, ?, , , ) 後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜尋的字串,而預設的貪婪模式則盡可能多的匹配所搜尋的字串。例如,對於字串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

例1:表示式\w+(?=[\d+])

1.匹配字串ab1cd22

結果:共找到 1 處匹配:

ab1cd2

流程:exp1=\w+,exp2=[\d+],exp=exp1+exp2=\w+\d+,根據exp表示式匹配得到ab1cd22,然後匹配掉乙個exp2即[\d+](最尾部的匹配到乙個符合的就結束),得到exp2匹配字串2(採用的是非貪婪模式,只要基礎匹配就可以了),而不是22,從而最終得到結果ab1cd22-2= ab1cd2。由於exp1和exp2有重疊的表示式\d+,所以結果看起來有些繞。

2.匹配字串abcd

結果:無任何匹配

流程:因為根本就沒有符合exp=\w+\d+的字串

例2:表示式:[a-z](?=\d)

1.匹配字串a1bc2

結果:共找到 2 處匹配:ac

流程:exp=[a-z]\d,a1匹配到,獲取a,繼續往下,直到c2匹配到,獲取c

例3:

在菜鳥教程裡面看到乙個正規表示式,^(?=.*[a-z])(?=.*[a-z])(?=.*\d).,瞬間就懵逼了,完全不能理會為什麼是用來確定一串字串一定是由大小寫字母以及數字組成的四位。

進行拆解:

1.表示式如果是^.(?=.*[a-z])那麼,即和表示式^.([a-z])結果一致。畢竟採用的是非貪婪獲取。

2.表示式如果是^(?=.*[a-z]).,那麼意味著匹配字串需要先符合[a-z]條件,然後整個字串就能夠繼續下一步匹配了。

例如:a1234,結果:a123。由於第乙個字元a的匹配,所以接下來,a123匹配到了.,因為?=不進行獲取字元。

3.表示式如果是(?=[a-z])(?=[a-z]).,這個表示式匹配不到任何東西。按照邏輯來看,第一步是找到[a-z],符合[a-z]後,需要符合[a-z]的,但由於前面多了個[a-z]的匹配,從而導致兩項衝突。

應該修改為(?=[a-z])(?=.*[a-z]).,如此就能夠進行匹配[a-z][a-z].型別的物件,主要是.*能夠將前面匹配的[a-z]匹配到的給抵消掉。

eg:aaaa,aa12,aaaa...

那麼最後來看表示式:^(?=.*[a-z])(?=.*[a-z])(?=.*\d). ,意思就明確了,必須匹配[a-z],[a-z],[\d]任何乙個,至於匹配到的物件因為?=的寫法,所以並不會被獲取到結果中去,而為了三個同時匹配,所以新增了(.*)用以消除另外的零寬斷言的影響。只要字串中存在大小寫字母以及數字(每個都得有乙個字元)即可,將會獲取到四個字元

(?<=exp)------------------這個大概已經淘汰了,正規表示式測試測不出來

(?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表示式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。

如果需要匹配後面的位置,如:

regularexpression

則要用到後發斷言(?<=。),使用(?<=。)\w+得到上面的匹配結果

使用(?<=).*(?=)匹配標籤中的內容

粗體

正規表示式 零寬斷言

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

正規表示式 零寬斷言

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

正規表示式 零寬斷言

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