關於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”。