问题 Vim正则表达式中的\&模式是什么?


我最近遇到了Vim regex builtins中的分支说明符。 Vim的帮助部分 \& 包含这个:

A branch is one or more concats, separated by "\&".  It matches the last
concat, but only if all the preceding concats also match at the same
position.  Examples:
      "foobeep\&..." matches "foo" in "foobeep".
      ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob"

目前尚不清楚它是如何使用的以及它的用途。对它的作用以及如何使用它的一个很好的解释将是伟大的。

要明确这一点  该 & (替换为整个匹配)用于替换,这就是 \& 用在一个模式中。

用法示例:

/\c\v([^aeiou]&\a){4}

用于搜索4个连续辅音(取自vim提示)。


7625
2017-08-19 08:54


起源

如果可以链接到您已阅读过的wiki或手册页,那会很棒吗? - Ibrahim Najjar
@Sniffer :help pattern。 - mhinz
@mhinz我现在正在运行Windows而且我没有VIM,但无论如何你似乎知道答案所以它很好。谢谢。 - Ibrahim Najjar


答案:


说明:

\& 是的 \|什么的  操作员是 要么 运营商。因此,两个concats必须匹配,但只有最后一个将被突出显示。

例1:

(以下测试假设 :setlocal hlsearch。)

想象一下这个字符串:

foo foobar

现在, /foo 将突出显示 foo 用两个词来说。但有时你只想匹配 foo 在 foobar。然后你必须使用 /foobar\&foo

无论如何它就是这样的。经常使用吗?到目前为止,我还没有看过几次。在如此简单的情况下,大多数人可能会使用零宽度原子。例如。与此示例相同,可以通过 /foo\zebar

例2:

/\c\v([^aeiou]&\a){4}

\c  - 忽略大小写

\v  - “非常神奇”( - >你不必逃避 & 在这种情况下)

(){4}  - 重复相同的模式4次

[^aeiou]  - 排除这些字符

\a  - 字母字符

因此,这个相当令人困惑的正则表达式将匹配 xxxxXXXXwXyZ 要么 WxYz 但不是 AAAA 要么 xxx1。用简单的术语表示:匹配任何不包含'a','e','i','o'或'u'的4个字母字符串。


14
2017-08-19 09:15



非常好的解释。 - Ibrahim Najjar
@Sniffer注意:在所有情况下,concat可以替换为零宽度正向前瞻(a\&b\&c 总是 \%(a\)\@=\%(b\)\@=c,想知道为什么你没有提到这个,只有几个关于零宽度原子的话。前瞻/后视比concats更强大,习惯只使用它们是有意义的,因为当你学习新的正则表达式引擎时,它更有可能既不支持前瞻也不支持concats或者只支持look - 而不是对concats有任何支持。 - ZyX
另请注意 \zs 用作零宽度是错误的:尝试搜索 .\zso 同 foo 在缓冲区中并与结果进行比较 .\@<=o。不知道有什么bug \ze 虽然。 - ZyX
@ZyX感谢您的澄清。我不与VIM合作,也不知道它支持什么,但对操作员的mhinz解释似乎很合理,所以我对他的答案进行了投票。 - Ibrahim Najjar
@mhinz经过一番思考后,我认为这种行为不是一个bug。但 .\@<=o 火柴 二 O公司, .\zso, 火柴 一 O操作。这似乎是因为一个 o 由前一场比赛拍摄,与后视不同, \zs 在零宽度和非零宽度零件匹配后应用。并且在前一场比赛已经占据的位置上不可能有非零宽度匹配。 - ZyX