vim 正規表示式 很強大

2021-09-04 05:05:37 字數 3640 閱讀 2508

毋庸多言,在vim中正規表示式得到了十分廣泛的應用。 最常用的 / 和 :s 命令中,正規表示式都是不可或缺的。 下面對vim中的正規表示式的一些難點進行說明。

關於magic

vim中有個magic的設定。設定方法為:

:set magic " 設定magic :set nomagic " 取消magic :h magic " 檢視幫助

vim畢竟是個編輯器,正規表示式中包含的大量元字元如果原封不動地引用(像perl 那樣), 勢必會給不懂正規表示式的人造成麻煩,比如 /foo(1) 命令, 大多數人都用它來查詢foo(1)這個字串, 但如果按照正規表示式來解釋,被查詢的物件就成了 foo1 了。

於是,vim就規定,正規表示式的元字元必須用反斜槓進行轉義才行, 如上面的例子,如果確實要用正規表示式,就應當寫成 /foo\(1\) 。 但是,像 . * 這種極其常用的元字元,都加上反斜槓就太麻煩了。 而且,眾口難調,有些人喜歡用正規表示式,有些人不喜歡用……

為了解決這個問題,vim設定了 magic 這個東西。簡單地說, magic就是設定哪些元字元要加反斜槓哪些不用加的。 簡單來說:

magic(\m):除了 $ . * ^ 之外其他元字元都要加反斜槓。nomagic(\m):除了 $ ^ 之外其他元字元都要加反斜槓。

這個設定也可以在正規表示式中通過 \m \m 開關臨時切換。 \m 後面的正規表示式會按照 magic 處理,\m 後面的正規表示式按照 nomagic 處理, 而忽略實際的magic設定。

例如:/\m.* # 查詢任意字串 /\m.* # 查詢字串 .* (點號後面跟個星號)

另外還有更強大的 \v 和 \v。

\v(即 very magic 之意):任何元字元都不用加反斜槓\v(即 very nomagic 之意):任何元字元都必須加反斜槓

例如:/\v(a.c)$ # 查詢行尾的abcaccadc /\m(a.c)$ # 查詢行尾的(abc) /\m(a.c)$ # 查詢行尾的(a.c) /\v(a.c)$ # 查詢任意位置的(a.c)$

預設設定是 magic,vim也推薦大家都使用magic的設定,在有特殊需要時,直接通過 \v\m\m\v 即可。

本文下面使用的元字元都是 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 正規表示式

vim正規表示式 vim中的正規表示式功能很強大,如果能自由運用,則可以完成很多難以想象的操作。如果你比較熟悉perl的正規表示式,可以直接參照 與perl正規表示式的區別 一節。使用正規表示式的命令 使用正規表示式的命令最常見的就是 搜尋 命令。其格式如下 正規表示式 另乙個很有用的命令就是 s ...

vim正規表示式

元字元 說明 匹配任意乙個字元 abc 匹配方括號中的任意乙個字元。可以使用 表示字元範圍,如 a z0 9 匹配小寫字母和阿拉伯數字。abc 在方括號內開頭使用 符號,表示匹配除方括號中字元之外的任意字元。d 匹配阿拉伯數字,等同於 0 9 d 匹配阿拉伯數字之外的任意字元,等同於 0 9 x 匹...

Vim正規表示式

vim中的正規表示式功能很強大,如果能自由運用,則可以完成很多難以想象的操作。如果你比較熟悉perl的正規表示式,可以直接參照與perl正規表示式的區別 一節。使用正規表示式的命令最常見的就是 搜尋 命令。其格式如下 正規表示式另乙個很有用的命令就是 s 替換 命令,將第乙個 之間的正規表示式替換成...