14

我最近在 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 提示)。

4

2 回答 2

17

解释:

\&is to \|and运算符对or运算符的意义。因此,两个 concat 必须匹配,但只有最后一个会突出显示。

示例 1:

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

想象一下这个字符串:

foo foobar

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

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

示例 2:

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

\c- 忽略大小写

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

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

[^aeiou]- 排除这些字符

\a- 字母字符

因此,这个相当令人困惑的正则表达式将匹配xxxx, XXXX, wXyZorWxYz但不匹配AAAAor xxx1。简单来说:匹配任何不包含 'a'、'e'、'i'、'o' 或 'u' 的 4 个字母字符的字符串。

于 2013-08-19T09:15:34.167 回答
0

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

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

将找到包含one,two并且three以任何顺序排列的行。这.*是必要的,因为每个分支必须在同一个地方开始匹配。

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

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

在线上

The numbers three, two, and one

结果是

<The numbers three>, two, and one

于 2019-11-04T13:22:36.583 回答