本書關注的是一種強大的工具——“正規表示式”。它將教會讀者如何使用正規表示式解決各種問題,以及如何充分使用支援正規表示式的工具和語言。許多關於正規表示式的文件都沒有介紹這種工具的能力,而本書的目的正是讓讀者“精通”正規表示式。許多種工具都支援正規表示式(文字編輯器、文書處理軟體、系統工具、資料庫引擎,等等),不過,要想充分挖掘正規表示式的能力,還是應當將它作為編輯語言的一部分。例如Java、JScript、VisualBasic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事實上,在一些用上述語言編寫的程式中,正規表示式扮演了極其重要的角色。正規表示式能夠得到眾多語言和工具的支援是有原因的:它們極其有用。從較低的層面上來說,正規表示式描述的是一串文字(achunkoftext)的特徵。讀者可以用它來驗證使用者輸入的資料,或者也可以用它來檢索大量的文字。從較高的層面上來說,正規表示式容許使用者掌控他們自己的資料——控制這些資料,讓他們為自己服務。掌握正規表示式,就是掌握自己的資料。
——來自本書序言
正規表示式入門
本篇寫的是正規表示式入門的內容,包括元字元及其相關術語,以及一些簡單的語言差異。
元字元
1.脫字元和美元符
字元^是脫字元,可以錨定一行文字的開頭;字元$是美元符,可以錨定一行文字的結束.注意,這裡匹配的都是位置,而不是字元或者內容。
2.字元組
字元組是指用方括號包圍起來的字元,類似[…]。匹配的內容是是一個字元1。要注意的是,字元組內部也有元字元,且字元組外部的元字元在字元組內部無意義。
-是連字元,在字元組的兩個字元中間可以表示一個範圍,如[1-6]可以表示[123456]。在字元組中,如果要匹配連字元,最好放在最前面2。
^放在字元組開頭,則成為一個排除型字元組,會匹配除了排除型字元組中所有字元的字元。
3.匹配任意字元
.(dot)可以匹配任意字元(除了.自身)。要注意的是,這個.可能被濫用,最好在使用前考慮清楚:檢索的文字是否會對錶達式造成干擾?是否都是固定格式?
4.多選結構
可以用|來表示或。這個元字元可以把多個子表示式組合起來,只要求匹配其中一個即可。這時,子表示式又稱作“多選分支”(alternative)。
由於字元組只能匹配單個字元,而多選結構則可以匹配字串,彌補了它的缺陷。
5.忽略大小寫
在Python中,使用引數i開啟。在英文中,經常出現這中需要。而忽略大小寫就可以避免某些人由於打錯字或者對單詞的不熟悉導致的問題。
6.單詞分界符
在Python中,使用作為其分界符。
在egrep中,使用<\>來做分界符。
分界符可以對單詞的起始和結束位置進行檢查,而不至於將一個單詞從另一個單詞中分離。
7.可選項元素
?在一個字元或者分組後面,意為著其匹配的內容允許出現,但是不出現也沒問題。
8.量詞
*、+和?的位置相同,實際上是對其匹配內容出現的次數做一個限定。
+:要求匹配的內容出現一次及以上。
*:要求匹配的內容出現0次及以上3。
如果需要指定出現的次數,可以使用{m,n},匹配內容m次到n次。
9.括號
如果需要使用分組,或者對一個分組進行量詞限定,就可以使用它了。使用括號以後,可以:
-
在後面進行反向引用
-
作為一個子表示式使用
-
限制多選結構
10.轉義符
對正規表示式的元字元進行轉義,實際上就是加一個實現。比如()就是指一個括號,而不是一個分組。
11. 總結
元字元 | 名稱 | 功能 |
---|---|---|
. | 點 | 匹配單個任意字元 |
[…] | 字元組 | 匹配單個字元組出現的字元 |
[^…] | 排除型字元組 | 匹配單個未在字元組出現的字元 |
char | 轉義符 | 如果char是元字元或沒有特殊含義, 則匹配char。 |
? | 問號 | 容許非必須的一次匹配 |
+ | 加號 | 匹配1次以上 |
* | 星號 | 匹配任意次 |
{min,max} | 區間量詞 | 匹配min次到max次。 |
^$ | 脫字元和美元符 | 匹配一行文字的開頭和結束。 |
邊界符 | 匹配單詞的邊界 | |
| | | | 多選結構 |
(…) | 括號 | 用處有三,請看上面 |
1.2 | 反向引用 | 對括號捕捉到的分組進行引用。 |