星期日, 五月 24, 2020

VIM学习笔记 4种Magic模式

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

  • magic模式,使用\m前缀,其后模式的解释方式为'magic'选项。^$.*[]等字符含有特殊意义;而+?()、和{}等其它字符则按字面意义解释。magic为默认设置,表达式中的\m前缀可以省略;
  • no magic模式,使用\M前缀,其后模式的解释方式为'nomagic'选项。除了^$之外的特殊字符,都将被视为普通文本;
  • very magic模式,使用\v前缀,其后模式中除 '0'-'9','a'-'z','A'-'Z' 和 '_' 之外的字符都当作特殊字符解释;
  • very nomagic模式,使用\V前缀,其后模式中只有反斜杠(\)具有特殊意义。

不同模式之间的区别,在于哪些特殊字符需要使用反斜杠(\)进行转义。例如星号(*),在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<上一篇 | 目录 下一篇>

没有评论:

发表评论