正則表達式基礎(稍微瞭解下)

  【摘自《正則表達式之道》】

 

  正則表達式由一些普通字符和一些元字符(metacharacters)組成普通字符包括大小寫的字母和數字,而元字符則具有特殊的含義,我們下面會給予解釋。

  在最簡單的情況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。

  要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了所有的元字符和對它們的一個簡短的描述。

 

元字符 描述
.點 匹配任何單個字符。例如正則表達式r.t匹配這些字符串:rat、rut、r t,但是不匹配root。
$ 匹配行結束符。例如正則表達式weasel$ 能夠匹配字符串"He's a weasel"的末尾   但是不能匹配字符串"They are a bunch of weasels."
^ 匹配一行的開始。例如正則表達式^When in能夠匹配字符串"When in the course of human events"的開始,但是不能匹配"What and When in the"
* 匹配0或多個正好在它之前的那個字符。例如正則表達式.*意味着能夠匹配任意數量的任何字符。
/ 這是引用符,用來將這裏列出的這些元字符當作普通的字符來進行匹配。例如正則表達式/$被用來匹配美元符號,而不是行尾,類似的,正則表達式/.用來匹配點字符,而不是任何字符的通配符。
[ ]   [c1-c2]   [^c1-c2] 匹配括號中的任何一個字符。例如正則表達式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括號中使用連字符-來指定字符的區間,例如正則表達式[0-9]可以匹配任何數字字符可以制定多個區間,例如正則表達式[A-Za-z]可以匹配任何大小寫字母另一個重要的用法是“排除”,要想匹配除了指定區間之外的字符——也就是所謂的補集——在左邊的括號和第一個字符之間使用^字符,例如正則表達式[^269A-Z] 將匹配除了2、6、9和所有大寫字母之外的任何字符
/< /> 匹配詞(word)的開始(/<)和結束(/>)。例如正則表達式/<the/>能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。
/( /) 將 /( 和 /) 之間的表達式定義爲“組”(group),並且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用 /1 到/9 的符號來引用。
| 將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。
+ 匹配1或多個正好在它之前的那個字符。例如正則表達式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。
? 匹配0或1個正好在它之前的那個字符。注意:這個元字符不是所有的軟件都支持的。
/{i/}   /{i,j/} 匹配指定數目的字符,這些字符是在它之前的表達式定義的。例如正則表達式A[0-9]/{3/} 能夠匹配字符"A"後面跟着正好3個數字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達式[0-9]/{4,6/} 匹配連續的任意4個、5個或者6個數字字符。注意:這個元字符不是所有的軟件都支持的。

 

 

 最簡單的元字符是點,它能夠匹配任何單個字符(注意不包括換行符)。假定有個文件test.txt包含以下幾行內容:

  he is a rat

  he is in a rut

  the food is Rotten

  I like root beer

  我們可以使用grep命令來測試我們的正則表達式,grep命令使用正則表達式去嘗試匹配指定文件的每一行,並將至少有一處匹配表達式的所有行顯示出來。命令

  grep r.t test.txt

  在test.txt文件中的每一行中搜索正則表達式r.t,並打印輸出匹配的行。正則表達式r.t匹配一個r接着任何一個字符再接着一個t。所以它將匹配文件中的rat和rut,而不能匹配Rotten中的Rot,因爲正則表達式是大小寫敏感的。要想同時匹配大寫和小寫字母,應該使用字符區間元字符(方括號)。正則表達式[Rr]能夠同時匹配R和r。所以,要想匹配一個大寫或者小寫的r接着任何一個字符再接着一個t就要使用這個表達式:[Rr].t。

  要想匹配行首的字符要使用抑揚字符(^)——又是也被叫做插入符。例如,想找到text.txt中行首"he"打頭的行,你可能會先用簡單表達式he,但是這會匹配第三行的the,所以要使用正則表達式^he,它只匹配在行首出現的h。

  有時候指定“除了×××都匹配”會比較容易達到目的,當抑揚字符(^)出現在方括號中是,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情性(也就是the和she),可以使用:[^st]he。

  可以使用方括號來指定多個字符區間。例如正則表達式[A-Za-z]匹配任何字母,包括大寫和小寫的;正則表達式[A-Za-z][A-Za-z]* 匹配一個字母后面接着0或者多個字母(大寫或者小寫)。當然我們也可以用元字符+做到同樣的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等價。但是要注意元字符+ 並不是所有支持正則表達式的程序都支持的。關於這一點可以參考後面的正則表達式語法支持情況。

  要指定特定數量的匹配,要使用大括號(注意必須使用反斜槓來轉義)。想匹配所有100和1000的實例而排除10和10000,可以使用:10/{2,3/},這個正則表達式匹配數字1後面跟着2或者3個0的模式。在這個元字符的使用中一個有用的變化是忽略第二個數字,例如正則表達式0/{3,/} 將匹配至少3個連續的0。

簡單的例子

  這裏有一些有代表性的、比較簡單的例子。

  

vi 命令 作用
:%s/ */ /g 把一個或者多個空格替換爲一個空格
:%s/ *$// 去掉行尾的所有空格
:%s/^/ / 在每一行頭上加入一個空格
:%s/^[0-9][0-9]* // 去掉行首的所有數字字符
:%s/b[aeio]g/bug/g 將所有的bag、beg、big和bog改爲bug。
:%s/t/([aou]/)g/h/1t/g 將所有tag、tog和tug分別改爲hat、hot和hug(注意用group的用法和使用/1引用前面被匹配的字符)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章