正規表示式基礎知識
正規表示式是一種可以用於模式匹配和替換的強有力的工具,乙個正規表示式就是由普通的字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式,它描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。
正規表示式在字元資料處理中起著非常重要的作用,我們可以用正規表示式完成大部分的資料分析處理工作,如:判斷乙個串是否是數字、是否是有效的email位址,從海量的文字資料中提取有價值的資料等等,如果不使用正規表示式,那麼實現的程式可能會很長,並且容易出錯。
我們先從簡單的開始。假設你要搜尋乙個包含字元「cat」的字串,搜尋用的正規表示式就是「cat」。如果搜尋對大小寫不敏感,單詞「catalog」、「catherine」、「sophisticated」都可以匹配。也就是說:
正規表示式:cat
匹配:cat,catalog,catherine,sophisticated
1.1 句點符號
假設你在玩英文拼字遊戲,想要找出三個字母的單詞,而且這些單詞必須以「t」字母開頭,以「n」字母結束。另外,假設有一本英文本典,你可以用正規表示式搜尋它的全部內容。要構造出這個正規表示式,你可以使用乙個萬用字元——句點符號「.」。這樣,完整的表示式就是「t.n」,它匹配「tan」、「ten」、「tin」和「ton」,還匹配「t#n」、「tpn」甚至「t n」,還有其他許多無意義的組合。這是因為句點符號匹配所有字元,包括空格、tab字元甚至換行符:
正規表示式:c.t
匹配:tan,ten,tin,ton,t n,t#n,tpn等
1.2 方括號符號
為了解決句點符號匹配範圍過於廣泛這一問題,你可以在方括號(「」)裡面指定看來有意義的字元。此時,只有方括號裡面指定的字元才參與匹配。也就是說,正規表示式「t[aeio]n」只匹配「tan」、「ten」、「tin」和「ton」。但「toon」不匹配,因為在方括號之內你只能匹配單個字元:
正規表示式:t[aeio]n
匹配:tan,ten,tin,ton等
1.3 「或」符號
如果除了上面匹配的所有單詞之外,你還想要匹配「toon」,那麼,你可以使用「|」操作符。「|」操作符的基本意義就是「或」運算。要匹配「toon」,使用「t(a|e|i|o|oo)n」正規表示式。這裡不能使用方擴號,因為方括號只允許匹配單個字元;這裡必須使用圓括號「()」。圓括號還可以用來分組,具體請參見後面介紹。
正規表示式:t(a|e|i|o|oo)n
匹配:tan,ten,tin,ton,toon等
1.4 表示匹配次數的符號
表一顯示了表示匹配次數的符號,這些符號用來確定緊靠該符號左邊的符號出現的次數:
表一:表示次數的符號
符號
次數
*
0次或多次
+
1次或多次
?
0次或1次
恰好n次
叢n次到m次
假設我們要在文字檔案中搜尋美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正規表示式如圖一所示。在正規表示式中,連字元(「-」)有著特殊的意義,它表示乙個範圍,比如從0到9。因此,匹配社會安全號碼中的連字符號時,它的前面要加上乙個轉義字元「/」。
圖一:匹配所有123-12-1234形式的社會安全號碼
假設進行搜尋的時候,你希望連字符號可以出現,也可以不出現——即,999-99-9999和999999999都屬於正確的格式。這時,你可以在連字符號後面加上「?」數量限定符號,如圖二所示:
圖二:匹配所有123-12-1234和123121234形式的社會安全號碼
下面我們再來看另外乙個例子。美國汽車牌照的一種格式是四個數字加上二個字母。它的正規表示式前面是數字部分「[0-9]」,再加上字母部分「[a-z]」。圖三顯示了完整的正規表示式。
圖三:匹配典型的美國汽車牌照號碼,如8836kv
1.5 「否」符號
「^」符號稱為「否」符號。如果用在方括號內,「^」表示不想要匹配的字元。例如,圖四的正規表示式匹配所有單詞,但以「x」字母開頭的單詞除外。
圖四:匹配所有單詞,但「x」開頭的除外
1.6 圓括號和空白符號
假設要從格式為「june 26, 1951」的生日日期中提取出月份部分,用來匹配該日期的正規表示式可以如圖五所示:
圖五:匹配所有moth dd,yyyy格式的日期
新出現的「/s」符號是空白符號,匹配所有的空白字元,包括tab字元。如果字串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上乙個圓括號建立乙個組,然後用oro api(本文後面詳細討論)提取出它的值。修改後的正規表示式如圖六所示:
圖六:匹配所有month dd,yyyy格式的日期,定義月份值為第乙個組
1.7 其它符號
為簡便起見,你可以使用一些為常見正規表示式建立的快捷符號。如表二所示:
表二:常用符號
符號
等價的正規表示式
/d
[0-9]
/d
[^0-9]
/w
[a-za-z_0-9] /w
[^/w] /s
[ /t/n/x0b/f/r] /s
[^/s]
例如,在前面社會安全號碼的例子中,所有出現「[0-9]」的地方我們都可以使用「/d」。修改後的正規表示式如圖七所示:
圖七:匹配所有123-12-1234格式的社會安全號碼
正規表示式基礎知識
我們先從簡單的開始。假設你要搜尋乙個包含字元 cat 的字串,搜尋用的正規表示式就是 cat 如果搜尋對大小寫不敏感,單詞 catalog catherine sophisticated 都可以匹配。也就是說 1.1 句點符號 假設你在玩英文拼字遊戲,想要找出三個字母的單詞,而且這些單詞必須以 t ...
正規表示式基礎知識
乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。如 jscript vbscript 匹配 t t 匹配乙個空白行。d d d d 驗證乙個i...
正規表示式基礎知識
vbscript 匹配 t t 匹配乙個空白行。d d d d 驗證乙個id 號碼是否由乙個2位數字,乙個連字元以及乙個5位數字組成。匹配乙個 html 標記。下表是元字元及其在正規表示式上下文中的行為的乙個完整列表 字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個...