概論:
在各種有關文本處理的程式中,往往要用到Regex。熟練掌握Regex,是一項基本技能。本文,主要說明Regex的原理與應用,並給出了詳細例子,用於情景學習,無論是使用VIM ,sed,awk,grep等程式,都能在本文著那個找到協助。另外,我們在VS2010這些IDE中可以方便使用替換某個單詞來實現快速編輯,本文將為你介紹Vim下實現這個功能的方法;另外本文還將告訴你,Vim下更為強大的替換功能:“將一個函數的前後兩個參數進行替換”等功能。熟練掌握Regex,有利於快速實現對文本的編輯。
本文來源:Regex簡明教程——grep Vim的尋找與替換執行個體
1.基礎知識
什麼是字元。
字元,符號簡單的說就是抽象,一定的符號表示一定的意義。一般來說,字元含義有三種“一般字元、特殊字元、逸出字元”。例如在ASCII中,a就表示a(一般字元);/表示轉意後面一個字元,%表示格式化輸出(特殊字元);\n表示斷行符號(逸出字元),就是讓n不代表它本身的意義(一般意義或者特殊意義).同時,逸出字元可以讓一個一般字元也表達特殊意義如\a,也可以讓一個特殊字元表達一般意義/%。不同語言體系的特殊字元不同,轉意字元也不同。例如在漢語中,“。”表示句子的終結,但是放在逸出字元“”之中就僅僅表示“。”。(所以,從理論上說,只要你喜歡,你完全可以把所有的逸出字元和格式化特殊字元都用一般字元來表示,不過此時,你的符號系統需要更多的字元來區分)
2.Regex
如你所知,我們通常意義上說的Regex其實包含兩部分:Regex的處理引擎(grep,C#等程式中都包含)和Regex文法,一定的文法要輸入在引擎中才能起作用,理解這一點很重要。而本文主要為你講述Regex的文法。
下面,談一談Regex中的逸出字元(注意,不同的語系中特殊字元的含義不同,例如C語言中$是一般字元,但在Regex中卻不是):
2.1特殊字元:
/ [ ] ^ % $ * + . | ( ) –
特別字元 |
說明 |
$ |
匹配輸入字串的結尾位置。如果設定了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n' 或‘\r'。要匹配 $ 字元本身,請使用 \$。 |
() |
標記一個子運算式的開始和結束位置。子運算式可以擷取供以後使用。要匹配這些字元,請使用 \( 和 \)。 |
* |
匹配前面的子運算式零次或多次。要匹配 * 字元,請使用 \*。 |
+ |
匹配前面的子運算式一次或多次。要匹配 + 字元,請使用 \+。 |
. |
匹配除分行符號 \n之外的任何單字元。要匹配 .,請使用 \。 |
[] |
標記一個中括號運算式的開始。要匹配 [,請使用 \[。 |
? |
匹配前面的子運算式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 \?。 |
\ |
將下一個字元標記為或特殊字元、或原義字元、或反向參考、或八進位轉義符。例如, ‘n' 匹配字元 ‘n'。'\n' 匹配分行符號。序列 ‘\\' 匹配 “\”,而 ‘\(' 則匹配 “(”。 |
^ |
匹配輸入字串的開始位置,除非在方括號運算式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用 \^。 |
{} |
標記限定符運算式的開始。要匹配 {,請使用 \{。 |
| |
指明兩項之間的一個選擇。要匹配 |,請使用 \|。 |
2.2轉義
\d
表示一個數位字元,等價與[0-9].
\D
表示一個非數位字元,等價與[^0-9].
\f
表示一個form-feed字元(unix).
\n
表示一個linefeed字元(新行符).
\r
表示一個carriagereturn字元(複位符).
\s
表示任意一個非分行符號的whitespace(空白字元),包括空格,tab,form-feed等.
\S
表示一個非分行符號的non-whitespace(非空白字元).
\t
表示一個tab.
\v
表示一個縱向tab(unix).
\w
表示任意一個顯示字元,包括底線(數字,