毋庸多言,在vim中正規表示式得到了十分廣泛的應用。 最常用的 / 和 :s 命令中,正規表示式都是不可或缺的。 下面對vim中的正規表示式的一些難點進行說明。
vim中有個magic的設定。設定方法為:
:set magic " 設定magicvim畢竟是個編輯器,正規表示式中包含的大量元字元如果原封不動地引用(像perl那樣), 勢必會給不懂正規表示式的人造成麻煩,比如 /foo(1) 命令, 大多數人都用它來查詢foo(1)這個字串, 但如果按照正規表示式來解釋,被查詢的物件就成了 foo1 了。:set nomagic " 取消magic
:h magic " 檢視幫助
於是,vim就規定,正規表示式的元字元必須用反斜槓進行轉義才行, 如上面的例子,如果確實要用正規表示式,就應當寫成 /foo\(1\) 。 但是,像 . * 這種極其常用的元字元,都加上反斜槓就太麻煩了。 而且,眾口難調,有些人喜歡用正規表示式,有些人不喜歡用……
為了解決這個問題,vim設定了 magic 這個東西。簡單地說, magic就是設定哪些元字元要加反斜槓哪些不用加的。 簡單來說:
這個設定也可以在正規表示式中通過 \m \m 開關臨時切換。 \m 後面的正規表示式會按照 magic 處理,\m 後面的正規表示式按照 nomagic 處理, 而忽略實際的magic設定。
例如:
/\m.* # 查詢任意字串另外還有更強大的 \v 和 \v。/\m.* # 查詢字串 .* (點號後面跟個星號)
例如:
/\v(a.c)$ # 查詢行尾的abcaccadc預設設定是 magic,vim也推薦大家都使用magic的設定,在有特殊需要時,直接通過 \v\m\m\v 即可。/\m(a.c)$ # 查詢行尾的(abc)
/\m(a.c)$ # 查詢行尾的(a.c)
/\v(a.c)$ # 查詢任意位置的(a.c)$
本文下面使用的元字元都是 magic 模式下的。
vim的量詞與perl相比一點也不遜色。
vimperl意義*
*0個或多個(匹配優先)\++
1個或多個(匹配優先)
\? 或 \=
?0個或1個(匹配優先),\?不能在 ? 命令(逆向查詢)中使用
\n個到m個(匹配優先)
\最少n個(匹配優先)
\最多m個(匹配優先)
\恰好n個\?
n個到m個(忽略優先)\*?
0個或多個(忽略優先)\+?
1個或多個(忽略優先)\??
0個或1個(忽略優先)
從上表中可見,vim的忽略優先量詞不像perl的 *? +? ?? 那樣,而是統一使用 \ 匹配n-m個
\ 匹配n個
\ 匹配n-任意個
\ 匹配0-m個
\_. 匹配包含換行在內的所有字元
\ 表示前乙個字元可出現零次或多次,但在整個正規表示式可以匹配成功的前提下,匹配的字元數越少越好
\= 匹配乙個可有可無的項
\_s 匹配空格或斷行
\_元字元 說明
\* 匹配 * 字元。
\. 匹配 . 字元。
\/ 匹配 / 字元。
\\ 匹配 \ 字元。
\[ 匹配 [ 字元。
表示位置的符號
元字元 說明
$ 匹配行尾
^ 匹配行首
\< 匹配單詞詞首
\> 匹配單詞詞尾
替換變數
在正規表示式中使用 \( 和 \) 符號括起正規表示式,即可在後面使用\1、\2等變數來訪問 \( 和 \) 中的內容。
懶惰模式
\ 與\一樣,盡可能少次數地重複
\ 匹配它前面的項一次或0次, 盡可能地少
\| "或"操作符
\& 並列
函式式:s/替換字串/\=函式式
在函式式中可以使用 submatch(1)、submatch(2) 等來引用 \1、\2 等的內容,而submatch(0)可以引用匹配的整個內容。
與perl正規表示式的區別 ?
元字元的區別
vim語法 perl語法 含義
\+ + 1-任意個
\? ? 0-1個
\ n-m個
\(和\) (和) 分組
例如:1,去掉所有的行尾空格:「:%s/\s\+$//」。「%」表示在整個檔案範圍內進行替換,「\s」表示空白字元(空格和製表符),「\+」對前面的字元匹配一次或多次(越多越好),「___fckpd___0rdquo;匹配行尾(使用「\___fckpd___0rdquo;表示單純的「___fckpd___0rdquo;字元);被替換的內容為空;由於一行最多隻需替換一次,不需要特殊標誌。這個還是比較簡單的。(/)
2,去掉所有的空白行:「:%s/\(\s*\n\)\+/\r/」。這回多了「\(」、「\)」、「\n」、「\r」和 「*」。「*」代表對前面的字元(此處為「\s」)匹配零次或多次(越多越好;使用「\*」表示單純的「*」字元),「\n」代表換行符,「\r」代表回車符,「\(」和「\)」對表示式進行分組,使其被視作乙個不可分割的整體。因此,這個表示式的完整意義是,把連續的換行符(包含換行符前面可能有的連續空白字元)替換成為乙個單個的換行符。唯一很特殊的地方是,在模式中使用的是「\n」,而被替換的內容中卻不能使用「\n」,而只能使用「\r」。原因是歷史造成的,詳情如果有興趣的話可以檢視「:help nl-used-for-nul」。
3,去掉所有的「//」注釋:「:%s!\ s*//.*!!」。首先可以注意到,這兒分隔符改用了「!」,原因是在模式或字串部分使用了「/」字元,不換用其他分隔符的話就得在每次使用「/」字元本身時寫成「\/」,上面的命令得寫成「:%s/\s*\/\/.*//」,可讀性較低。命令本身倒是相當簡單,用過正規表示式的人估計都知道「.」匹配表示除換行符之外的任何字元吧。
4,去掉所有的「/* */」注釋:「:%s!\s*/\*\_.\\*/\s*! !g」。這個略有點複雜了,用到了幾個不太常用的 vim 正規表示式特性。「\_.」匹配包含換行在內的所有字元;「\」表示前乙個字元可出現零次或多次,但在整個正規表示式可以匹配成功的前提下,匹配的字元數越少越好;標誌「g」表示一行裡可以匹配和替換多次。替換的結果是個空格的目的是保證像「int/* space not necessary around comments */main()」這樣的表示式在替換之後仍然是合法的。
:g/^\s*$/d 刪除只有空白的行
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 將 data1 data2 修改為 data2 data1
:%s/\(\w\+\), \(\w\+\)/\2 \1/ 將 doe, john 修改為 john doe
:%s/\/\=line(".") 將各行的 id 字串替換為行號
:%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1)
將每行開頭的單詞替換為(行號-10).單詞的格式,如第11行的word替換成1. word
排序 :/ob/+1,$!sort
vim的幫助檔案非常有用,關於正規表示式可以參考以下的內容。
:h pattern**::h magic
:h perl-patterns
參考:
vim 正規表示式
vim正規表示式 vim中的正規表示式功能很強大,如果能自由運用,則可以完成很多難以想象的操作。如果你比較熟悉perl的正規表示式,可以直接參照 與perl正規表示式的區別 一節。使用正規表示式的命令 使用正規表示式的命令最常見的就是 搜尋 命令。其格式如下 正規表示式 另乙個很有用的命令就是 s ...
vim正規表示式
元字元 說明 匹配任意乙個字元 abc 匹配方括號中的任意乙個字元。可以使用 表示字元範圍,如 a z0 9 匹配小寫字母和阿拉伯數字。abc 在方括號內開頭使用 符號,表示匹配除方括號中字元之外的任意字元。d 匹配阿拉伯數字,等同於 0 9 d 匹配阿拉伯數字之外的任意字元,等同於 0 9 x 匹...
Vim正規表示式
vim中的正規表示式功能很強大,如果能自由運用,則可以完成很多難以想象的操作。如果你比較熟悉perl的正規表示式,可以直接參照與perl正規表示式的區別 一節。使用正規表示式的命令最常見的就是 搜尋 命令。其格式如下 正規表示式另乙個很有用的命令就是 s 替換 命令,將第乙個 之間的正規表示式替換成...