正規表示式基礎知識

2021-05-23 16:53:24 字數 2834 閱讀 6794

正規表示式基礎知識

正規表示式是一種可以用於模式匹配和替換的強有力的工具,乙個正規表示式就是由普通的字元(例如字元 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 標記。下表是元字元及其在正規表示式上下文中的行為的乙個完整列表 字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個...