零寬斷言的意思是(匹配寬度為零,滿足一定的條件/斷言) 我也不知道這個(gè)詞語(yǔ)是那個(gè)王八蛋發(fā)明的报破,簡(jiǎn)直是太拗口了淘捡。
零寬斷言用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西眷篇,也就是說(shuō)它們像 \b ^ $ < > 這樣的錨定作用,用于指定一個(gè)位置臊岸,這個(gè)位置應(yīng)該滿足一定的條件(即斷言)橙数,因此它們也被稱為零寬斷言。 斷言用來(lái)聲明一個(gè)應(yīng)該為真的事實(shí)帅戒。正則表達(dá)式中只有當(dāng)斷言為真時(shí)才會(huì)繼續(xù)進(jìn)行匹配灯帮。
其中零寬斷言又分四種:
1)
先行斷言 也叫零寬度正預(yù)測(cè)先行斷言(?=exp) -- 表示匹配表達(dá)式前面的位置
例如 [a-z]*(?=ing) 可以匹配 cooking 和 singing 中的 cook 與 sing 。
注意:先行斷言的執(zhí)行步驟是這樣的先從要匹配的字符串中的最右端找到第一個(gè) ing (也就是先行斷言中的表達(dá)式)然后 再匹配其前面的表達(dá)式逻住,若無(wú)法匹配則繼續(xù)查找第二個(gè) ing 再匹配第二個(gè) ing 前面的字符串钟哥,若能匹配則匹配,符合正則的貪婪性瞎访。
例如: .*(?=ing) 可以匹配 "cooking singing" 中的 "cooking sing" 而不是 cook
2)
后發(fā)斷言 也叫零寬度正回顧后發(fā)斷言(?<=exp) -- 表示匹配表達(dá)式后面的位置
例如(?<=abc).* 可以匹配 abcdefg 中的 defg
注意:后發(fā)斷言跟先行斷言恰恰相反 它的執(zhí)行步驟是這樣的:先從要匹配的字符串中的最左端找到第一個(gè)abc(也就是先行斷言中的表達(dá)式)然后 再匹配其后面的表達(dá)式腻贰,若無(wú)法匹配則繼續(xù)查找第二個(gè) abc 再匹配第二個(gè) abc 后面的字符串,若能匹配則匹配扒秸。
例如(?<=abc).* 可以匹配 abcdefgabc 中的 defgabc 而不是 abcdefg
3)
負(fù)向零寬斷言
負(fù)向零寬斷言 (?!exp) 也是匹配一個(gè)零寬度的位置播演,不過(guò)這個(gè)位置的“斷言”取表達(dá)式的反值,例如 (?!exp) 表示 "exp" 前面的位置伴奥,如果 "exp" 不成立 宾巍,匹配這個(gè)位置;如果 "exp" 成立渔伯,則不匹配。同樣肄程,負(fù)向零寬斷言也有“先行”和“后發(fā)”兩種锣吼,負(fù)向零寬后發(fā)斷言為 (?<!exp)
負(fù)向零寬后發(fā)斷言(?<!exp)
負(fù)向零寬先行斷言 (?!exp)
負(fù)向零寬斷言要注意的跟正向的一樣选浑。
常用分組語(yǔ)法
分類(lèi)
代碼/語(yǔ)法
說(shuō)明
捕獲
(exp)
匹配exp,并捕獲文本到自動(dòng)命名的組里
(?<name>exp)
匹配exp,并捕獲文本到名稱為name的組里,也可以寫(xiě)成(?'name'exp)
(?:exp)
匹配exp,不捕獲匹配的文本玄叠,也不給此分組分配組號(hào)
零寬斷言
(?=exp)
匹配exp前面的位置
(?<=exp)
匹配exp后面的位置
(?!exp)
匹配后面跟的不是exp的位置
(?<!exp)
匹配前面不是exp的位置
注釋
(?#comment)
這種類(lèi)型的分組不對(duì)正則表達(dá)式的處理產(chǎn)生任何影響古徒,用于提供注釋讓人閱讀
例子:
cat file
aaa bbb CD="123" fd
要取出CD后面的值:
grep -oP '(?<=CD=")\d+' file
[解析]
以 CD=" 為后發(fā)斷言,匹配它后面的多個(gè)數(shù)字读恃。
cat file
Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm
要取出那幾個(gè)分貝的值:
-5.01
-2.41
grep -oP '(?<=: ).*?(?=d)' file
[解析]
后發(fā)斷言 ”: “ 后面的字符串隧膘,直到 d 字符前面的字符串,? 號(hào)的作用是避免貪婪匹配寺惫。
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 字樣的內(nèi)容:
check_hardware
check_filesystem
grep -Po '[^"]+(?=",false)' file