什么是\& Vim's Regex中的模式

时间:2013-08-19 08:54:37

标签: regex 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提示)。

2 个答案:

答案 0 :(得分:14)

<强>解释

\&\|运算符属于运算符。因此,两个联合都必须匹配,但只有最后一个会突出显示。

示例1:

(以下测试假定为:setlocal hlsearch。)

想象一下这个字符串:

foo foobar

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

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

示例2:

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

\c - 忽略大小写

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

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

[^aeiou] - 排除这些字符

\a - 字母字符

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

答案 1 :(得分:0)

\&可用于以任意顺序匹配包含两个(或更多)单词的行。例如,

/.*one\&.*two\&.*three

将查找包含任何顺序的onetwothree的行。 .*是必需的,因为每个分支必须在同一位置开始匹配。

请注意,最后一个分支是参与任何替换的分支。例如,应用以下替换:

s/.*one\&.*two\&.*three/<&>/

在线

The numbers three, two, and one

产生

<The numbers three>, two, and one

相关问题