乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       weicat 2010-07-27

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

      關(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ù)人都用它來(lái)查找foo(1)這個(gè)字符串,但如果按照正則表達(dá)式來(lái)解釋?zhuān)徊檎业膶?duì)象就成了 foo1 了。

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

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

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

      這個(gè)設(shè)置也可以在正則表達(dá)式中通過(guò) \m \M 開(kāi)關(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í),直接通過(guò) \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è)(忽略?xún)?yōu)先)
      \{-} *? 0個(gè)或多個(gè)(忽略?xún)?yōu)先)
      \{-1,} +? 1個(gè)或多個(gè)(忽略?xún)?yōu)先)
      \{-,1} ?? 0個(gè)或1個(gè)(忽略?xún)?yōu)先)

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

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

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

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

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

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

      參考

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

      :h pattern
      :h magic
      :h perl-patterns

       


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(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)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多