Mastering Regular Expressions
Jerffrey E.F.Friedl著的這本書,聞名已久。九月份從噹噹網郵購了一本,卻一直沒有時間堅持讀,主要原因當然還是英文差,沒有養成閱讀英文的習慣和能力。
後悔呀,當初為什麼不多花點時間在英語上面。
開篇說的那個可怕的、尋找重複單詞的需求非常生動,如果是我遇到這樣的需求,肯定同樣會很苦惱。
- 檢查N個檔案,找到重複的單詞(比如“this this”),然後報出它們在哪個檔案的哪一行,還要用標準ANSI的逸出序列來高度顯示它們;
- 不僅如此,還要正確處理這種情況:某行的最後一個單詞,與緊跟著的下一(非空)行的第一個單詞相同,也就是說要能夠跨行工作。
- 在 尋找過程中,還要忽略大小寫區別,並且能把單詞之間的任意數量空格都等同於單個空格對待,最重要的是,兩個重複單詞中的某一個或兩個被HTML標記包圍 著,那還是算重複單詞!比如“...it is <B>very</B> very important...”
這樣的需求聽上去很討厭,但有了Regex,一切就變得容易了。
下表是基本的元字元:
| 元字元 |
名稱 |
匹配行為 |
備忘 |
| ^ |
脫字元 |
匹配行的起始位置 |
|
| $ |
美圓符 |
匹配行的結束位置 |
|
| /< |
反斜線及小於符 |
匹配單詞的起始邊界 |
不是所有版本的的egrep都支援這個特性 |
| /> |
反斜線及大於符 |
匹配單詞的結束邊界 |
| . |
點 |
匹配任意單個字元 |
|
| [...] |
字元集 |
匹配所有方括弧中列出的字元 |
|
| [^...] |
字元非集 |
匹配所有不在方括弧中列出的字元 |
|
| | |
或符號 |
匹配或符號分開的的運算式 |
|
| (...) |
圓括弧 |
用於指定“或”符號的範圍 |
|
註:
- 如果一個元字元出現在字元集中(被方括弧括起來的字元列表),則它不再是元字元,比方,點字元在方括弧以外時,它是一個元字元,代表任一字元,如果它出現在方括弧裡,則代表點字元本身。
- 在字元集和字元非集中中,如果減號字元出現在第一個字元位置,則它代表減號本身,否則它表示一個範圍,比如[-a-z0-9],第一個減號代表減號本身,第二個減號表示範圍,與字元a和z一起表示從a至z的26個英文小寫字母,第三個減號與第二個減號的意義一樣。
- 字元非集的概念需要仔細,比如,[^X]並不意味著“只要不是字元X就匹配”,而是“匹配一個不是X的任一字元”,前者的意義可以匹配一個空行,但[^X]並不匹配空行。
- 某些版本的egrep支援-i參數,以執行忽略大小寫匹配操作。