毋庸多言,在vim中正規表示式得到了十分廣泛的應用。 最常用的 / 和 :s 命令中,正規表示式都是不可或缺的。 下面對vim中的正規表示式的一些難點進行說明。
vim中有個magic的設定。設定方法為:
:set magic " 設定magic
:set nomagic " 取消magic
:h magic " 檢視幫助
vim畢竟是個編輯器,正規表示式中包含的大量元字元如果原封不動地引用(像perl那樣),
勢必會給不懂正規表示式的人造成麻煩,比如 /foo(1) 命令, 大多數人都用它來查詢foo(1)這個字串, 但如果按照正規表示式來解釋,被查詢的物件就成了 foo1 了。
於是,vim就規定,正規表示式的元字元必須用反斜槓進行轉義才行, 如上面的例子,如果確實要用正規表示式,就應當寫成 /foo(1) 。 但是,像 . * 這種極其常用的元字元,都加上反斜槓就太麻煩了。 而且,眾口難調,有些人喜歡用正規表示式,有些人不喜歡用……
為了解決這個問題,vim設定了 magic 這個東西。簡單地說, magic就是設定哪些元字元要加反斜槓哪些不用加的。
簡單來說:
這個設定也可以在正規表示式中通過 \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的 *? +? ?? 那樣,而是統一使用 {- 實現的。 這大概跟忽略優先量詞不常用有關吧。
vim居然還支援環視和固化分組的功能,強大,贊乙個 :d
關於環視的解釋請參考yurii的《精通正規表示式》一書吧。
vimperl
意義\@=
(?=順序環視
\@!(?!
順序否定環視
\@<=
(?<=
逆序環視
\@(?
逆序否定環視
\@>
(?>
固化分組
\%(atom\)
(?:非捕獲型括號
和perl稍有不同的是,vim中的環視和固化分組的模式的位置與perl不同。 例如,查詢緊跟在 foo 之後的 bar,perl將模式寫在環視的括號內, 而vim將模式寫在環視的元字元之前。
# perl的寫法
/(?<=foo)bar/
# vim的寫法
/\(foo\)\@<=bar
vim的幫助檔案非常有用,關於正規表示式可以參考以下的內容。
:h pattern
:h magic
:h perl-patterns
vi 中的正規表示式
表 元字元 功能 例子 匹配什麼 錨定行的開始 love 匹配所有以love開頭的行.錨定行的結束 love 匹配所有以love結束的行.匹配乙個字元 l.e 匹配這樣的行,這些行包含這樣的字元,第乙個字元是 l,緊跟著兩個字元,然後是e.代表0個或多個先前字元 love 匹配這樣的行,有0個或者多...
vi正規表示式
搜尋命令 正規表示式 替換命令 s 正規表示式 替換字串 選項 s str1 str2 g 該命令中 表示進入命令列模式,表示對該檔案所有行有效,s表示查詢並替換,正規表示式str1表示被替換的內容,字串str2表示替換後的內容,g表示整行有效 正規表示式字元匹配 例項替換 例項刪除 3.刪除所有空...
VI 正規表示式
一 vi中如何使用正規表示式 使用正規表示式的命令最常見的就是 搜尋 命令。其格式如下 正規表示式 另乙個很有用的命令就是 s 替換 命令,將第乙個 之間的正規表示式替換成第二個 之間的字串。s 正規表示式 替換字串 選項 二 元字元 元字元是具有特殊意義的字元。使用元字元可以表達任意字元 行首 行...