VIM学习笔记 4种Magic模式

根据对于特殊元字符的不同解释方式,Vim正则表达式可以分为四种模式:magic,no magic,very magic和very nomagic。

不同模式之间的区别,在于哪些特殊字符需要使用反斜杠(\)进行转义。例如星号(*),在magic和very magic模式下视为特殊修饰符;而在no magic和very nomagic模式下则被视为普通字符,必须使用“\*”恢复其特殊作用。

对于简单的正则表达式,使用“\”对特殊字符进行转义,可能并不会造成困扰;但在复杂的正则表达式中,对大量特殊字符的重复转义,将使得表达式过于繁琐且难以阅读。

例如在默认的magic模式下,使用以下命令查找十六进制色彩值。其中,使用()构建捕获组;使用{}匹配6位和3位十六进制值。因为有多种特殊字符需要进行转义,造成表达式过于冗长:

/\m#\(\x\{6\}\|\x\{3\}\)

而使用very magic模式,则可以简化表达式:

/\v#(\x{6}|\x{3})

4种Magic模式的差异和用法,可以简单总结如下:

模式前缀特殊字符示例适用场景
magic\m^$.*[]匹配每行中的任意内容/^.*$默认模式
nomagic\M^$/\M^\.\*$查找字符串中包含特殊字符
very magic\v除'0-9','a-z','A-Z','_'之外匹配十六进制色彩值/\v#(\x{6}|\x{3})使用较多特殊字符的复杂正则表达式
very nomagic\V\匹配正则表达式本身/\V^.*$进行精确的完整匹配
查找字符串中包含特殊字符

以下表格,列示了常用特殊字符在不同模式下的应用。其中,黄色高亮表示为无需转义的特殊字符:

very magicmagicnomagicvery nomagic用途
\v\m\M\V
^^^\^匹配行首
$$$\$匹配行尾
..\.\.匹配任何字符
**\*\*匹配任意次数
~~\~\~最近替代字符串
[][]\[]\[]匹配列表范围内的字符
{}\{\}\{\}\{\}匹配重复次数
()\(\)\(\)\(\)匹配组
<>\<\>\<\>\<\>匹配词首与词尾
+\+\+\+匹配一次或多次
?\?\?\?匹配零次或一次
|\|\|\|可选分支
\a\a\a\a字母字符
其它特殊字符元素
\\\\\\\\反斜杠 (字面意义)

请注意,“\{\}”也可简写为“\{}”;“\[]”必须仅保留开头的反斜杠;“\(\)”则需要完整的两个反斜杠。

magic默认模式

建议始终将'magic'选项保持在缺省值。

建议在模式之前,通过使用“\v“或“\M“等前缀,来明确激活特定模式。

如果希望始终使用Very magic模式,那么请在vimrc中定义以下键盘映射,将在查找和替换时自动激活very magic模式:

nnoremap / /\v
vnoremap / /\v
cnoremap %s/ %s/\v
nnoremap :g/ :g/\v

模式转换

你甚至可以在表达式当中改变模式。例如以下命令,开头使用very magic模式,之后转换为magic模式,整体表达式将匹配“foo(bar)”:

/\vfoo\(\mbar)

当然,非常不建议采用此种易引起误解的表达式写法。我们可以将其改写为very nomagic模式:

/\Vfoo(bar)

请使用以下命令,查看更多帮助信息:

:help /magic

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>