正則表達式之零寬斷言

介紹:

    零寬斷言用於查找在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像 \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標籤內裏的內容。
 
參考出處
《正則表達式30分鐘入門教程》http://deerchao.net/tutorials/regex/regex.htm#negativelookaround
《零寬斷言》http://www.ha97.com/book/OpenSource_Guide/ch26s09.html
《perl中的正則表達式》http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=159388

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章