正则表达式之零宽断言
生活随笔
收集整理的這篇文章主要介紹了
正则表达式之零宽断言
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
介紹:
零寬斷言用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像 \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?
轉載于:https://blog.51cto.com/horizon49/1163840
總結
以上是生活随笔為你收集整理的正则表达式之零宽断言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP Error 401.2 - U
- 下一篇: 黑马程序员-面向对象-06天-5(单例设