1. 程式人生 > >正則表示式的高階使用技巧

正則表示式的高階使用技巧

零寬斷言:

零寬斷言是正則表示式的一種方法,用於查詢在某些內容(但並不包括這些內容)之前或者之後的東西,也就是說他們像\b(匹配一個單詞邊界,也就是單詞和空格間的位置,正則表示式的匹配有兩種概念,一種是匹配字元,一種是匹配位置,這裡的\b就是匹配位置,例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”),^(匹配輸入字行首),$(匹配輸入字行尾)那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。斷言用來宣告一個應該為真的事實,正則表示式中只有當斷言為真時才會繼續進行匹配。
零寬斷言一共分為四種
1.零寬度正預測先行斷言 (?=exp)匹配exp前面的位置
例:\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢I’m singing while you’re dancing.時,它會匹配sing和danc。
2.零寬度正回顧後發斷言 (?<exp)匹配exp後面的位置
例:比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。
3.零寬度負預測先行斷言 (?!exp)匹配後面跟的不是exp的位置
例:例如:\d{3}(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。
4.零寬度負回顧後發斷言 (?<!exp)匹配前面不是exp的位置
例:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數字。

完全通配[\s\S]:

\s表示,只要出現空白就匹配,包括空格、換行、tab縮排等所有的空白;
\S表示,非空白就匹配;
這樣一正一反下來,就表示所有的字元,完全的,一字不漏的。
另外,[]這個符號,表示在它裡面包含的單個字元不限順序的出現,比如下面的正則:
[ace] 這表示,只要出現a/c/e這三個任意的字母,都會被匹配。
它們的組合,表示所有的都匹配,與它相對應的,有[\w\W]等,意義完全相同、
另外要說的一點是,為什麼有".“這個萬用字元了,還要這樣的用法。
其實,[\s\S] [\w\W]這樣的用法,比較”.“所匹配的還要多,因為”."是不會匹配換行的,所有出現有換行匹配的時候,人們就習慣 使用[\s\S]或者[\w\W]這樣的完全通配模式。

匹配括號之內的任意字元:

[…] 位於括號之內的任意字元

匹配不在括號之中的任意字元:

[^…] 不在括號之中的任意字元

貪婪匹配:(預設是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。)

?涉及到貪婪模式當正則表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配儘可能多的字元。以這個表示式為例:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。

非貪婪匹配:

也就是匹配儘可能少的字元。只要在它後面加上一個問號?。這樣.?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。
a.

?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元)和ab(第四到第五個字元)

反向引用:

若在正則表示式模式或模式的一部分兩側加上括號,就會導致表示式的一部分被儲存到臨時緩衝區中。
每個捕獲的子匹配項按照它們在正則表示式模式中從左到右出現的順序儲存。緩衝區編號從 1 開始,最多可儲存 99 個捕獲的子表示式。可以使用 \n來訪問每個緩衝區,其中n是標識特定緩衝區的一位或兩位十進位制數字。
比如(?<=<(\w+)>).*(?=</\1>)匹配不包含屬性的簡單HTML標籤內裡的內容。
\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果字首實際上是的話,字尾就是了。

參考:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html