歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 正則表達式之零寬斷言

正則表達式之零寬斷言

日期:2017/3/1 9:59:37   编辑:Linux編程

介紹:

零寬斷言用於查找在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像 \b ^ $ \< \> 這樣的錨定作用,用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。

斷言用來聲明一個應該為真的事實。正則表達式中只有當斷言為真時才會繼續進行匹配。

1.零寬度正預測先行斷言 (?=exp) 匹配exp前面的位置

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

注意:先行斷言的執行步驟是這樣的先從要匹配的字符串中的最右端找到第一個 ing (也就是先行斷言中的表達式)然後 再匹配其前面的表達式,

若無法匹配則繼續查找第二個 ing 再匹配第二個 ing 前面的字符串,若能匹配則匹配,符合正則的貪婪性。

2.零寬度正回顧後發斷言 (?<=exp) 匹配exp後面的位置

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

注意:後發斷言跟先行斷言恰恰相反 它的執行步驟是這樣的:先從要匹配的字符串中的最左端找到第一個abc(也就是先行斷言中的表達式)然後

再匹配其後面的表達式,若無法匹配則繼續查找第二個 abc 再匹配第二個 abc 後面的字符串,若能匹配則匹配。

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

3.零寬度負預測先行斷言 (?!exp) 匹配後面跟的不是exp的位置

例:\d{3}(?!\d)匹配三位數字,而且這三位數字的後面不能是數字

4.零寬度負回顧後發斷言 (?<!exp) 匹配前面不是exp的位置

例:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數字。

實例:

例1:\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。

例2:(?<=\bre)\w+\b 匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。

例3:(?<=\s)\d+(?=\s) 匹配以空白符間隔的數字(再次強調,不包括這些空白符)。

例4:((?<=\d)\d{3})+\b,用它對1234567890進行查找時結果是234567890。

例5:\b\w*q(?!u)\w*\b 匹配包含後面不是字母u的字母q的單詞

例6:\d{3}(?!\d) 匹配三位數字,而且這三位數字的後面不能是數字

例7:\b((?!abc)\w)+\b 匹配不包含連續字符串abc的單詞。

例8:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標簽內裡的內容。

Copyright © Linux教程網 All Rights Reserved