關於Vim的模式匹配

 

關於Vim的模式匹配

模式開關

當使用/...或者?...對文本進行查找,或者用s/...進行替換時,模式匹配開始起作用。

大家都知道,模式匹配中有一些特殊字符,它們對如何進行字符匹配起着關鍵性的作用。

如果用過Perl,那你很可能會不習慣Vim裏的模式書寫方式。因爲在默認情況下,Vim將|和()看做是原義字符,假設你想匹配a或b並把匹配放入緩存,那你要寫成“/(a/|b/)”。這顯然不夠簡煉,所以我習慣在模式串開始前使用/v來切換模式開關,前面的例子可以寫成“//va|b”。

下面引用一段Vim 7的中文說明文檔:

3. 魔術                                                           /magic

某些字符在模式中是按本義出現的。它們匹配自身。然而,當前面有一個反斜槓時,這些
字符具有特殊的含義。

另外一些字符即使沒有反斜槓也代表特殊的意思。它們反而需要一個反斜槓來匹配按本義
出現的自身。

一個字符是否按本義出現取決於 'magic' 選項以及下面將解釋的條目。
                                                        //m //M
使用 "/m" 會使得其後的模式的解釋方式就如同設定了 'magic' 選項一樣。而且將忽略
'magic' 選項的實際值。
使用 "/M" 會使得其後的模式的解釋方式就如同設定了 'nomagic' 選項一樣。
                                                        //v //V
使用 "/v" 會使得其後的模式中所有 '0'-'9','a'-'z','A'-'Z' 和 '_' 之外的字符都
當作特殊字符解釋。"very magic"

使用 "/V" 會使得其後的模式中只有反斜槓有特殊的意義。"very nomagic"

示例:
在這之後: /v        /m       /M       /V         匹配
                'magic' 'nomagic'
          $        $        $        /$         匹配行尾
          .        .        /.       /.         匹配任何字符
          *        *        /*       /*         前面匹配原的任意次重複
          ()       /(/)     /(/)     /(/)       組成爲單個匹配原
          |        /|       /|       /|         分隔可選分支
          /a       /a       /a       /a         字母字符
          //       //       //       //         反斜槓 (按本義)
          /.       /.       .        .          英文句號 (按本義)
          /{       {        {        {          '{'  (按本義)
          a        a        a        a          'a'  (按本義)

{僅 Vim 支持 /m,/M,/v 和 /V}

建議始終將 'magic' 選項保持在缺省值 -  'magic'。這可以避免移植性的麻煩。要使
模式不受該選項值的影響,在模式前面加上 "/m" 或 "/M"。

 

貪婪、非貪婪

Vim的模式匹配默認是貪婪的,“a.*b”匹配a和b之間的所有字符,假如一行中含有多個b,那麼將一直搜索到最後一個b。比如對“axbxxbxxx”進行匹配將得到“axbxxb”。如果僅僅想匹配“axb”,那麼就要使用非貪婪方式。

對於Perl,上面的例子可以使用“a.*?b”進行匹配(非貪婪),而在Vim中要寫成“a./{-}b”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章