1. 程式人生 > >vim的正則表示式(一)

vim的正則表示式(一)

------------------------------------------------------------------------------------------------

本文是在學習《使用vi編輯器, Lamb & Robbins編著》時在所記的筆記。
本文內容: 模式匹配規則(正則表示式) 元字元 模式匹配舉例 本文約定: $+命令表示在普通的bash的命令列下 :+命令表示在vim的ex(命令)模式, 按"Ctrl" + ":" 進入
------------------------------------------------------------------------------------------------

搜尋模式的元字元

進行全域性替換時,不僅可以使用固定的字串,還允許是搜尋由正則表示式指代的可變的單詞模式。 當你指定一個字面的字串時,搜尋可能會找到不想匹配的其他例項。 例如,在檔案搜尋單詞時,單詞可以有不同的使用方式。正則表示式有助於在上下文中搜索單詞。要注意正則表示式可以與vi的搜尋命令/?以及ex中的:g:s命令一起使用。 正則表示式由普通字元和許多稱為元字元的專用字元結合在一起組成,元字元及其使用方法如下所示。
元字元 用法
.(點) 匹配除換行符之外的任何一個單個字元。空格也將作為字元。 例如p.p可以匹配pep,pip和pcp.
*
(星號)
星號前面的一個字元可以出現0次或多次。 例如,bugs*將匹配bugs,bugss或bug。 *可以跟任何元字元。例如,由於.(點)代表任何字元,因此.*表示“匹配任意數量的任何字元”。 :s/End.*/End/會刪除End後面的所有字元
^ 當處在正則表示式的第一位時,它要求後面的正則表示式要出現在一行的開始。 例如,^Part可以匹配Parter,Partxx,但是不能匹配HeParter; ^...匹配一行的前三個字元。當^不在正則表示式的開始時,^只代表本身。
$
當處於正則表示式的最後一位時,它要求前面的正則表示式要出現在一行的結尾。
例如,here$可以匹配where, 但是不能匹配whoherehe。當不在結尾時,$就代表它本身。
\ 這是轉義字元,可以把後面的元字元看成普通字元。例如\.表示一個普通的字元點,\*表示普通字元星號,\\可以獲得真正的反斜杆(\)。
[ ] 匹配方括號中字元的任意一個。 例如[AB]將匹配A或B,p[aeiou]t,匹配pat,pet,pit,pot或put。可以通過使用連字元(-)來指定範圍。例如,[A-Z]匹配字母A到Z之間的任意一個大寫字母。[0-9]將匹配數字0到9之間的任意一個數字。 可以在方括號內包括多個範圍,也可以把範圍和單獨的字元混合在一起。例如[:;A-Za-z()]將匹配四種不同的標點符號和所有的字母。 大部分元字元都將在方括號內失去它們的特殊含義,因此如果想把它們作為普通字元使用,就不需要對它們進行轉義。在方括號內仍需要轉義的三個元字元是\-。連字元(-)的含義是範圍說明符,如果要使用真正的連字元,也可以將其放在放括號內的第一個字元位置。
插入符號(^)只有它在方括號內為第一個字元時才有特殊含義,但是這種情況下其含義與通常^元字元的含義不同。作為方括號的第一個字元,^使它們的含義反過來:將匹配不在方括號裡的任何一個字元。例如,[^a-z]將匹配任何不是小寫字母的字元。
\(和 \) 把\(和\)之間的模式儲存到專門的儲存空間(儲存緩衝區)中,單一行最多可以儲存9個模式。例如,要把this or That改為That or this :%s/\(this\) or \(That\)/\2 or \1/ \2和\1是對緩衝區的引用
\<和\> 在單詞的開始(\<)或結尾(\>)匹配字元。單詞的開始或結束由標點符號或空格決定。 例如: \<ac將只匹配ac開頭的單詞, ac\>將匹配以ac結尾的單詞
~ 匹配上一次搜尋中使用的任何正則表示式。 如果搜尋過The,那麼可以使用/~n來搜尋Then。可以把~等價與上次的The,再加上n組合成Then
上面只是一些很基本的正則表示式,除此之外還有很多拓展的正則表示式語法。

元字元在替換串中的使用

當在進行全域性替換時,上面的正則表示式之有在命令搜尋的部分有特殊含義,在替換串中是按照字元原來的意思來的。 例如, :%s /hello/$.^/ 會把hello替換成$.^,$.^在這裡沒有特殊含義,不需要用轉義(用了也可以)

替換串中的元字元

元字元 用法
\ 轉義
& 用在替換串,它代表與搜尋模式想匹配的整個文字,即“重現”搜尋串。這在試圖避免重複輸入文字時很有用。例如, :%s/hello/&, world/ 將會把hello替換成hello, wolrd :%s/.*/(&)/ 將會把所有行用()包含起來
用在替換串中,重複上次的替換串。例如, 上次使用$s/his/their/ 把his改為their 這次使用$ s/her/~/ 會把her改為their
\u或\l 把替換串中的下一個字元分別變成大寫或者小寫。例如, :s/yes, sir/\uyes, \usir/g 把yes, sir變成Yes, Sir
\U 或 \L 將跟在後面的匹配串全部變成大寫或小寫。例如, :s/world/\U&/ 把world變成WORLD
以上是基本的正則表示式,還有很多拓展的正則表示式。

更多的替換技巧

  • :s:s//~/相同,都是重複上次替換
  • 可以把&看作是“同一事情”的意思(與匹配的文字)。
  • &鍵也可以作為vi命令來執行:&命令(按shift + &),即重複上次替換。
  • :~:&(或shift+&)類似,~是重複上次任何命令中所使用的正則表示式,而不僅僅是替換命令。
  • 除了/字元外,還可以使用除反斜杆,雙引號和豎直線(\、"和|) 之外的任何非字母表、非空白字元作為分隔符,在對路徑名進行修改時,這點尤其便利::%s ; /user1/tim;/home/time;g 把/user1/tim改為/home/time

模式匹配舉例

1. 加入要把一個檔案內的所有child替換為children,如果直接用 :%s/child/children/g 可能會有問題,因為把children和Faichild這樣的單詞中的"child"部分替換為了children,可以用\<和\>來表示“只有該模式是個完整的單詞”, :%s/\<child\>/children/g

搜尋單詞的常規類

假設你的子函式名以字首mgi、mgr和mga開頭,例如: mgibox routine, mgrbox routine, mgabox routine, 既想保留字首,又想把box改為square,那麼下面兩個替換命令都可以完成: 1):g/mg\([ira]\)box/s//mg\1square/g 2):g/mg[ira]box/s/box/square/g