日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Vi中的正則表達(dá)式 - idv2

 weicat 2010-07-27

毋庸多言,在vim中正則表達(dá)式得到了十分廣泛的應(yīng)用。最常用的 / 和 :s 命令中,正則表達(dá)式都是不可或缺的。下面對(duì)vim中的正則表達(dá)式的一些難點(diǎn)進(jìn)行說明。

關(guān)于magic

vim中有個(gè)magic的設(shè)定。設(shè)定方法為:

:set magic             " 設(shè)置magic
:set nomagic           " 取消magic
:h magic               " 查看幫助

vim畢竟是個(gè)編輯器,正則表達(dá)式中包含的大量元字符如果原封不動(dòng)地引用(像perl那樣),勢(shì)必會(huì)給不懂正則表達(dá)式的人造成麻煩,比如 /foo(1) 命令,大多數(shù)人都用它來查找foo(1)這個(gè)字符串,但如果按照正則表達(dá)式來解釋,被查找的對(duì)象就成了 foo1 了。

于是,vim就規(guī)定,正則表達(dá)式的元字符必須用反斜杠進(jìn)行轉(zhuǎn)義才行,如上面的例子,如果確實(shí)要用正則表達(dá)式,就應(yīng)當(dāng)寫成 /foo\(1\) 。但是,像 . * 這種極其常用的元字符,都加上反斜杠就太麻煩了。而且,眾口難調(diào),有些人喜歡用正則表達(dá)式,有些人不喜歡用……

為了解決這個(gè)問題,vim設(shè)置了 magic 這個(gè)東西。簡(jiǎn)單地說, magic就是設(shè)置哪些元字符要加反斜杠哪些不用加的。簡(jiǎn)單來說:

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

這個(gè)設(shè)置也可以在正則表達(dá)式中通過 \m \M 開關(guān)臨時(shí)切換。 \m 后面的正則表達(dá)式會(huì)按照 magic 處理,\M 后面的正則表達(dá)式按照 nomagic 處理,而忽略實(shí)際的magic設(shè)置。

例如:

/\m.*          # 查找任意字符串
/\M.*          # 查找字符串 .* (點(diǎn)號(hào)后面跟個(gè)星號(hào))

另外還有更強(qiáng)大的 \v 和 \V。

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

例如:

/\v(a.c){3}$   # 查找行尾的abcaccadc
/\m(a.c){3}$   # 查找行尾的(abc){3}
/\M(a.c){3}$   # 查找行尾的(a.c){3}
/\V(a.c){3}$   # 查找任意位置的(a.c){3}$

默認(rèn)設(shè)置是 magic,vim也推薦大家都使用magic的設(shè)置,在有特殊需要時(shí),直接通過 \v\m\M\V 即可。

本文下面使用的元字符都是 magic 模式下的。

量詞

vim的量詞與perl相比一點(diǎn)也不遜色。

vim Perl 意義
* * 0個(gè)或多個(gè)(匹配優(yōu)先)
\+ + 1個(gè)或多個(gè)(匹配優(yōu)先)
\? 或 \= ? 0個(gè)或1個(gè)(匹配優(yōu)先),\?不能在 ? 命令(逆向查找)中使用
\{n,m} {n,m} n個(gè)到m個(gè)(匹配優(yōu)先)
\{n,} {n,} 最少n個(gè)(匹配優(yōu)先)
\{,m} {,m} 最多m個(gè)(匹配優(yōu)先)
\{n} {n} 恰好n個(gè)
\{-n,m} {n,m}? n個(gè)到m個(gè)(忽略優(yōu)先)
\{-} *? 0個(gè)或多個(gè)(忽略優(yōu)先)
\{-1,} +? 1個(gè)或多個(gè)(忽略優(yōu)先)
\{-,1} ?? 0個(gè)或1個(gè)(忽略優(yōu)先)

從上表中可見,vim的忽略優(yōu)先量詞不像perl的 *? +? ?? 那樣,而是統(tǒng)一使用 \{- 實(shí)現(xiàn)的。這大概跟忽略優(yōu)先量詞不常用有關(guān)吧。

環(huán)視和固化分組

vim居然還支持環(huán)視和固化分組的功能,強(qiáng)大,贊一個(gè) :D 關(guān)于環(huán)視的解釋請(qǐng)參考Yurii的《精通正則表達(dá)式》一書吧。

vim Perl 意義
\@= (?= 順序環(huán)視
\@! (?! 順序否定環(huán)視
\@<= (?<= 逆序環(huán)視
\@<! (?<! 逆序否定環(huán)視
\@> (?> 固化分組
\%(atom\) (?: 非捕獲型括號(hào)

和perl稍有不同的是,vim中的環(huán)視和固化分組的模式的位置與perl不同。例如,查找緊跟在 foo 之后的 bar,perl將模式寫在環(huán)視的括號(hào)內(nèi),而vim將模式寫在環(huán)視的元字符之前。

# Perl的寫法
/(?<=foo)bar/
# vim的寫法
/\(foo\)\@<=bar

參考

vim的幫助文件非常有用,關(guān)于正則表達(dá)式可以參考以下的內(nèi)容。

:h pattern
:h magic
:h perl-patterns

 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多