標籤:
Vim 的搜尋功能是在普通模式下輸入 / 開始的, 並且 Vim 的搜尋預設用Regex. 所以掌握Regex和Regex在 Vim 中的用法對於提升 Vim 體驗極其重要. Vim 的Regex協助可以從:h usr_27 或 :h regexp獲得(善用協助).
Vim 包含兩個Regex引擎:
- 老式的基於回溯的引擎, 支援所有功能.
- 新式的 NFA 引擎, 對某些模式會快很多, 但不支援所有功能.
Vim 會自動為你選擇合適的引擎, 不過, 如果遇到了問題或者想特別指定某一個引擎, 可以在模式開頭處加入:
\%#=0 強制自動選擇
\%#=1 強制使用舊引擎
\%#=2 強制使用 NFA 引擎
通常我們不需要關心Regex引擎, 甚至不用過多關注Regex文法, 只管在/後面輸入文本搜尋即可. 但下面的知識對提高效率非常有效.
Regex基本文法
運算式 |
含義 |
a|b |
匹配 a 或 b |
gr(a|e)y |
匹配 gray或 grey,同時()起捕獲分組作用 |
. |
匹配任一字元 |
[abc] |
匹配任一字元: a 或 b 或 c |
[^abc] |
匹配任一字元, 但不包括 a, b, c |
[a-z] |
匹配從 a 到 z 之間的任一字元 |
[a-zA-Z] |
匹配從 a 到 z, 及從 A 到 Z 之間的任一字元 |
^ |
匹配行首 |
$ |
匹配行尾 |
* |
匹配前一項內容 0 次或多次 |
? |
匹配前一項內容 0 次或 1 次 |
+ |
匹配前一項內容 1 次或多次 |
{n} |
匹配前一項內容 n 次 |
{n,} |
匹配前一項內容 n 次或多次 |
{n,m} |
匹配前一項內容次數介於 n 和 m 之間 |
Regex在 Vim 中
Vim 的Regex與主流的Regex基本一致, 對於熟悉 Python, .Net, Perl(額)語言的同學在用 Vim 的時候肯定會很親切. 但是畢竟有些不同.
一般Regex |
Vim Regex |
含義 |
\ |
\\ |
分隔可選分支 |
() |
\(\) |
分組, 組成單個匹配源 |
{} |
\{} |
指定匹配次數 |
{} |
\{-n,m} |
指定匹配次數, 但是儘可能少 |
. |
. |
匹配任一字元 |
* |
\* |
匹配前一項內容 0 次或多次 |
? |
\? |
匹配前一項內容 0 次或 1 次 |
? |
\= |
匹配前一項內容 0 次或 1 次 |
+ |
\+ |
匹配前一項內容 1 次或多次 |
記住了上面 Vim 特有的寫法, 再去寫搜尋運算式就很簡單自然了.
Vim中與Regex有關的設定項
- magic : 這個選項控制了Vim Regex的行為, 比如上面的|, (), {}都需要在前面加\ . 關於 magic 的協助請看:h magic
- \m : 用在運算式的開頭, 如同設定了magic選項
- \M : 用在運算式的開頭, 如同設定了magic選項
- \v : ‘very magic‘, 會使除0-9a-zA-z_ 以外的字元都解釋為特殊字元, 在這個選項的控制下, vim Regex的文法就特別像本文最開始提到的Regex基本文法. 值得一試.
- \V : ‘evry nomagic‘, 會使只有反斜線具有特殊含義, 其他字元都是字面字元. 這樣基本上就把Regex關閉了.
- \C : 大小寫敏感
- \c : 大小寫不敏感
轉自:VimChina
Vim與Regex