许多Unix工具的正则表达式语法通常是POSIX编码的基本正则表达式和扩展正则表达式(分别是BRE和ERE),在某些现代实现中,是Perl样式(PCRE是这种实现)。

Vim的魔术水平与此类外部定义但众所周知的类之间是否存在一对一的对应关系?看起来\m是BRE,而\v是ERE,但POSIX不包含环顾四周。

如果存在这种对应关系,它是否在某处定义? pattern.txt只提及POSIX

还是我们必须坚持用“魔术”来描述Vim正则表达式?

评论

可以肯定\ v包含<>单词边界,而AFAIK是Vim独有的。因此,不,只需将它们描述为“ Vim regex”即可。 (因为我不积极,所以不发布答案)

@Doorknob,我想您可能会发现有关答案即评论的讨论很有趣。由于您的评论有3个赞成票,并且没有评论可以告诉您这是不正确的,因此它可能是正确的(我不确定),但是建议进行编辑。等无法提高其准确性。作为已发布的答案,可以对其进行编辑以提高准确性,赞成,反对,回应等。

#1 楼

总之,没有。 Vim的正则表达式是一种独特的风味,没有其他选择可以使其表现得更像另一种风味。

我认为这是一件好事。

魔术

'magic'选项不会改变Vim使用的正则表达式。它只是反转了许多\逃逸的原子的行为。例如,默认情况下,+是文字+字符,其中\+表示“一个或多个前面的原子”。相反,*表示“零个或多个先前原子”,而\*是字面量*。许多人觉得这很混乱。在您的模式中使用\v会使它更加一致。 :help 'magic'提供了一个很好的摘要:


after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        $         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \       \       \       \         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'



个人而言,我认为默认行为对于代码文件而言是不错的选择,在这种情况下搜索并不罕见对于诸如foo(之类的东西,请使用文字(。我个人希望其他工具支持Vim的正则表达式。它具有一些在PCRE中无法实现或太繁琐的功能。与您要匹配的模式之前或之后不匹配。例如,PCRE模式q(?!u)(或Vim regex模式qu\@!)与q匹配,但后面没有u。 (这比q[^u]更正确,q要求(?<![a-z]{3})foo后面必须有一些字符。)

可变长度负向后看PCRE和许多其他口味都有一个限制,即负向后看图案必须具有固定的长度。这意味着像foo这样的模式(表示“字符串(?<![a-z]+)foo不以3个小写字母开头”)是可以的,但foo(表示“字符串\([a-z]\+\)\@<!foo不以任何数量的小写字母开头”)是好的。
Vim中不存在此限制。在Vim中,看起来像\zs的模式虽然看起来有点难看,但却是完全有效的。正则表达式。

匹配锚点的开始和结束

在我看来,最值得注意的是\zefoo(\zs.*\ze)锚点。这些允许您指定比赛的开始和结束。例如,(仅匹配)之类的函数调用中foo(...)(?<=foo\().*(?=\))之间的内容。这可以在PCRE中完成,但是它需要使用环视,这有点乏味:f

前缀匹配

Vim可以做的另一件很酷的事情是匹配任何前缀(包括空前缀)特定字符序列。例如,要匹配fofoofoodf\%[ood],可以使用模式f(o(od?)?)?。在PCRE中,这种模式看起来像\%23c。 (想象一下,对于更长的字符串!)

匹配光标,行和列的位置

Vim的正则表达式具有一些锚点,用于匹配缓冲区中的位置。



\%<23c匹配第23列

\%>23c匹配第23列之前

\%16l匹配第23列之后

\%#匹配第16行

与列相似,在行号前后都有锚点



q4312079q匹配光标位置

这对突出显示尾随空白很有用,除非您在行尾键入<< />





我认为值得使用Vim的正则表达式。非常适合用于主要用于编程的文本编辑器,并且功能非常强大。