Vi中的正規表示式

2021-06-20 22:15:21 字數 2163 閱讀 4237

毋庸多言,在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 正規表示式 替換字串 選項 二 元字元 元字元是具有特殊意義的字元。使用元字元可以表達任意字元 行首 行...