我最近遇到了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提示)。
答案 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
- 字母字符
因此,这个相当令人困惑的正则表达式将匹配xxxx
,XXXX
,wXyZ
或WxYz
,而不是AAAA
或xxx1
。用简单的术语表示:匹配任何不包含'a','e','i','o'或'u'的4个字母字符串。
答案 1 :(得分:0)
\&
可用于以任意顺序匹配包含两个(或更多)单词的行。例如,
/.*one\&.*two\&.*three
将查找包含任何顺序的one
,two
和three
的行。 .*
是必需的,因为每个分支必须在同一位置开始匹配。
请注意,最后一个分支是参与任何替换的分支。例如,应用以下替换:
s/.*one\&.*two\&.*three/<&>/
在线
The numbers three, two, and one
产生
<The numbers three>, two, and one