星期六, 五月 16, 2020

VIM学习笔记 正则表达式(Regex-VeryMagic)

假设希望在以下CSS代码中,查找所有颜色代码:

body { color: #3c3c3c; }
strong { color: #000; }

在默认的Magic模式下,使用以下命令可以匹配以“#”开头的十六进制色彩值:

/#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\)

在以上正则表达式中,[]用于指定可选字符范围,但不需要转义;()用于构建捕获组(Groups),需要使用\进行转义;{}用于指定重复次数,但只需要对开括号进行转义,与之对应的闭括号可以不用转义。由此可见,在Magic模式下,需要对很多特殊符号进行转义,而且转义的方式也欠缺一致性。在编写较复杂的正则表达式时,显得琐碎且难以阅读。

使用\v激活Very Magic模式,则可简化为更加友好的正则表达式:

/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})

body { color: #3c3c3c; }
strong { color: #000; }

Very magic

在模式开头使用\v激活very magic模式,其后除下划线(_)、大小写字母以及数字之外的所有字符都具有特殊含义。这样可以避免重复输入大量的转义符(\),也使得正则表达式更加清晰易读。

假设在以下文本中,希望搜索单引号包围的内容:

you have mocking some 'bird of the year'.
you have mocking some 'the year's bird'.

在默认的magic模式下,使用以下模式来处理单词中的单引号:

/'\('\w\|[^']\)\+'

you have mocking some 'bird of the year'.
you have mocking some 'the year's bird'.

如果使用VeryMagic模式,命令则可以简化为:

/\v'('\w|[^'])+'

假设在以下文本中,希望仅保留英文字母:

12345aaa678
12345bbb678
12345ccc678

使用以下替换命令,可以删除其中的数字部分:

:%s/\d\{5\}\(\D\+\)\d\{3\}/\1/

aaa
bbb
ccc

如果使用VeryMagic模式,命令则可以简化为:

:%s/\v\d{5}(\D+)\d{3}/\1/

由此可见,Very magic模式为使用正则表达式提供了极大的便利。但很不幸,我们并无法将Very magic模式设置为默认选项。潜在的替代方案是,定义以下键盘映射,在查找时自动激活very magic模式:

:noremap / /\v

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

:help /\v

Very No Magic

在模式开头使用\V指定Very No Magic模式,将使得其后模式中只有反斜杠(\)具有特殊意义,而()[]|.*?等等元字符都将被视为普通文本。

如果您需要精确的完整匹配,并且查找字符串中包含特殊字符时,那么可以使用Very nomagic模式。

例如以下命令,将查找字符串“Fun.test(*args)” 。也就是说,其中的“*”和“.”都被视为普通字符,而不需要进行转义:

/\VFun.test(*args)

假设需要在以下文本中查找“a.k.a”:

The N key searches backward
the \v pattern switch (a.k.a. very magic)

因为“.”在正则表达式中具有特殊含义,它将会匹配任意字符,所以使用以下命令,将会同时匹配单词“backward”中的部分字符:

/a.k.a

The N key searches backward
the \v pattern switch (a.k.a. very magic)

当然,可以使用转义符来消除“.”的特殊含义:

/a\.k\.a\.

而更简单的方法是,在命令中使用\V激活very nomagic模式:

/\Va.k.a.

此时,将只会按字面匹配到单词“a.k.a”:

The N key searches backward
the \v pattern switch (a.k.a. very magic)

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

:help /\V

小结

我们可以将 very magic 和 very nomagic 模式,理解为对于正则表达式的两种极端处理方式。需要构建较复杂正则表达式时,推荐使用very magic模式;需要按字面意义查找文本时,则推荐使用very nomagic 模式。

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

没有评论:

发表评论