正則表達式學習小記

身爲一名程序員卻不瞭解正則表達式(Regular Expression), 除了懶惰,估計沒有其他的原因可以搪塞過去,此記. 

1.定義
正則表達式由一些普通字符和一些元字符(metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具有特殊的含義.

元字符   描述
--------------------------------------------------------------------------------
.   匹配任何單個字符。例如正則表達式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個數字字符。注意:這個元字符不是所有的軟件都支持的。
--------------------------------------------------------------------------------


2.實例:神奇的咒語(例子都是在VI下的命令)
[例1]將所有方法foo(a,b,c)的實例改爲foo(b,a,c)。這裏a、b和c可以是任何提供給方法foo()的參數。也就是說我們要實現這樣的轉換:

之前   之後
foo(10,7,2)  foo(7,10,2)
foo(x+13,y-2,10) foo(y-2,x+13,10)
foo( bar(8), x+y+z, 5)  foo( x+y+z, bar(8), 5)


下面這條替換命令能夠實現這一魔法:

:%s/foo(/([^,]*/),/([^,]*/),/([^)]*/))/foo(/2,/1,/3)/g

[解析]
/([^,]*/) 將不含逗號的0或多個字符標記爲組1
foo(/([^,]*/) 這一段可以簡單的翻譯爲“當你找到foo(就把其後直到第一個逗號之前的部分標記爲/1”

[例3]假設有一個多字符的片斷重複出現,例如:
Billy tried really hard
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard
而你想把"really"、"really really",以及任意數量連續出現的"really"字符串換成一個簡單的"very"(simple is good!),那麼以下命令:

:%s//(really /)/(really /)*/very /

就會把上述的文本變成:
Billy tried very hard
Sally tried very hard
Timmy tried very hard
Johnny tried very hard

[解析]
表達式/(really /)*匹配0或多個連續的"really "(注意結尾有個空格),
而/(really /)/(really /)* 匹配1個或多個連續的"really "實例。

 

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