1. 程式人生 > >正則表示式貪婪模式與非貪婪模式

正則表示式貪婪模式與非貪婪模式

3.零寬斷言編輯

用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧: (?=exp)也叫零寬度正預測先行斷言[4] ,它斷言自身出現的位置的後面能匹配表示式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢I'm singing while you're dancing.時,它會匹配sing和danc。 (?<=exp)也叫零寬度正回顧後發斷言[4] ,它斷言自身出現的位置的前面能匹配表示式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。 假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查詢需要在前面和裡面新增逗號的部分:((?<=\D)\D{3})+\b,用它對xxxxxxxxxx進行查詢時結果是xxxxxxxxx 下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符) 斷言用來宣告一個應該為真的事實。正則表示式中只有當斷言為真時才會繼續進行匹配。

4.負向零寬
編輯

如果我們只是想要確保某個字元沒有出現,但並不想去匹配它時怎麼辦?例如,如果我們想查詢這樣的單詞--它裡面出現了字母q,但是q後面跟的不是字母u,我們可以嘗試這樣: \b\w*q[^u]\w*\b匹配包含後面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出現在單詞的結尾的話,像Iraq,Benq,這個表示式就會出錯。這是因為[^u]總要匹配一個字元,所以如果q是單詞的最後一個字元的話,後面的[^u]將會匹配q後面的單詞分隔符(可能是空格,或者是句號或其它的什麼),後面的\w*\b將會匹配下一個單詞,於是\b\w*q[^u]\w*\b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,並不消費
任何字元。,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。 零寬度負預測先行斷言(?!exp),斷言此位置的後面不能匹配表示式exp。例如:\d{3}(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。 同理,我們可以用(?<!exp),零寬度負回顧後發斷言來斷言此位置的前面不能匹配表示式exp:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數字。 請詳細分析表示式(?<=<(\w+)>).*(?=<\/\1>),這個表示式最能表現零寬斷言的真正用途。 一個更復雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標籤內裡的內容。(?<=<(\w+)>)指定了這樣的字首:被尖括號括起來的單詞(比如可能是<b>),然後是.*(任意的字串),最後是一個字尾(?=<\/\1>)。注意字尾裡的\/,它用到了前面提過的字元轉義,將”/“轉義;\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果字首實際上是<b>的話,字尾就是</b>了。整個表示式匹配的是<b>和</b>之間的內容(再次提醒,不包括字首和字尾本身)。

5.啟示
編輯

(1) 心中時刻保持新穎想法,嘗試用各種新辦法來解決遇到的問題。對於遇到的問題,在用常規的解決思路無法解決或不能很好解決的時候,可以大膽探索嘗試採用新的方法或思路來解決問題,說大點就是創新!沒有新思路估計今天的正則表示式還要等幾百年才能露現人間。 (2) 善於學習和借鑑前人的經驗和成果,UNIX鼻祖Ken Thompson是什麼樣子的人?是被計算機界尊稱為“UNIX之父”的大師級別的人物,大師都在不斷思考從其它學科、其它知識領域的工作成果,來改進自己的工作或程式,事實也證明這樣做取得巨大結果和後來的深遠影響是事先誰也無法預估到的,我們在做一些事情或研究的時間,是否也考慮學習大師的優秀習慣? (3) 學好數學、英語並保持對數學、英語的興趣,數學也是人類幾千年積累的智慧結晶,學習數學知識可以培養和訓練人的思維能力。看這篇文章的朋友,我想很多都是計算機相關專業的朋友,至於數學和英語對於計算機學習和發展的重要性的道理,這裡就不在多說,重在實踐加持之以恆! (4) 養成獨立思考的習慣。上學時候老師經常說人與動物的最大區別是人能思考。拉美洲有句關於“思考”的諺語是,不會思考的人是白痴,不肯思考的人是懶漢,不敢思考的人是奴隸。我想大家和我一樣,既不願做懶漢、奴隸,更不願做白痴。所以相信正則分享網的朋友們一定會選擇做一個“會思、肯思、敢思”的人。 (5) 當正則表示式和字串函式都能解決問題時,一定要使用字串函式,這樣不容易出錯,最重要的是字串函式比正則表示式實現效能上要好得多。[1]