正規表示式 零寬斷言

2021-06-26 16:18:10 字數 2326 閱讀 7543

零寬斷言的意思是(匹配寬度為零,滿足一定的條件/斷言)

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

其中零寬斷言又分四種: 1)

先行斷言   也叫零寬度正**先行斷言(?=exp)   --  表示匹配表示式前面的位置 

例如 [a-z]*(?=ing) 可以匹配 cooking 和 singing 中的 cook 與 sing 。

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

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

2)後發斷言   也叫零寬度正回顧後發斷言(?<=exp)  --  表示匹配表示式後面的位置 

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

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

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

3)負向零寬斷言 

負向零寬斷言 (?!exp) 也是匹配乙個零寬度的位置,不過這個位置的「斷言」取表示式的反值,例如 (?!exp) 表示 "exp" 前面的位置,如果 "exp" 不成立 ,匹配這個位置;如果 "exp" 成立,則不匹配。同樣,負向零寬斷言也有「先行」和「後發」兩種,負向零寬後發斷言為 (?

負向零寬後發斷言(?

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

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

常用分組語法

分類**/語法

說明捕獲

(exp)

匹配exp,並捕獲文字到自動命名的組裡

(?exp)

匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?'name'exp)

(?:exp)

匹配exp,不捕獲匹配的文字,也不給此分組分配組號

零寬斷言

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp後面的位置

(?!exp)

匹配後面跟的不是exp的位置

(?匹配前面不是exp的位置

注釋(?#comment)

這種型別的分組不對正規表示式的處理產生任何影響,用於提供注釋讓人閱讀

例子:

cat file

aaa bbb cd="123" fd

要取出cd後面的值:

grep -op '(?<=cd=")\d+' file

[解析]

以 cd=" 為後發斷言,匹配它後面的多個數字。

cat file 

rx optical power: -5.01dbm, tx optical power: -2.41dbm

要取出那幾個分貝的值:

-5.01

-2.41

grep -op '(

?<=:

).*?

(?=d)' file

[解析]

後發斷言 」: 「 後面的字串,直到 d 字元前面的字串,? 號的作用是避免貪婪匹配。

cat file

["check_ssh",ok],["check_eth",ok],["check_disk",ok],["check_swap",ok],["check_mem",ok],["check_hardware",false],["check_filesystem",false],["check_port",ok],["check_redis-server",ok],["check_login",ok]

取出[ ]中含 false 字樣的內容:

check_hardware

check_filesystem

grep -po '[

^"]+(?="

,false

)' file

等價擴充套件:[^"]+(?="(\s*),(\s*)false)

只匹配方括號內:(?<=\[)(.*?)(?=\])

正規表示式 零寬斷言

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

正規表示式 零寬斷言

接下來的四個用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 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 匹配...