Vim匹配使用交替运算符|没有捕获组

时间:2013-10-10 09:02:52

标签: vim

我有一个vimscript,它从vim命令行传递的字符串中获取匹配列表。字符串的一部分具有类似some-word的模式。以下输出总结了问题:

echo matchlist("some-word", escape('(\w|-)+', '()+|')) " => ['some-word', 'd', '', '', '', '', '', '', '', '']

我知道'd'是由捕获组引起的。我尝试使用[\w|-],但这不起作用。我发现避免这种情况的一种方法是使用非捕获组\%(\w|-),但似乎添加了更多代码。 vim在perl中没有像[]这样的解决方案吗?

2 个答案:

答案 0 :(得分:8)

Vim中非捕获组的语法是\%(...\),如果您不想捕获匹配项,则应该使用它。在其他正则表达方言(如Perl's)中,这可以用更好/更短的方式表达,这是无关紧要的。

如果您对所有/某些捕获组不感兴趣,您还可以使用matchstr() / 列表切片,例如matchlist(...)[0:1]

另一个注意事项:使用escape()来简化一些正则表达式原子是非常规的。如果你想避免大多数反斜杠,你可以通过将\v添加到正则表达式来切换到非常神奇的模式;见:help /\v。得到的正则表达式为\v(\w|-)+

答案 1 :(得分:3)

Vim支持"收藏"就像在Perl中一样,使用相同的[..]语法。即使在Perl中,你也不要把|在集合中,除非你想匹配文字|字符。

但是,在Vim的[..]组中不支持像\ w这样的特殊字符。相反,您将使用像[:alpha:]或[:alnum:]。

这样的字符类

因此,在您的具体情况下,您可能需要:[-[:alnum:]_]\+

这包括' - ',' _',数字和字母。有关详细信息,请参阅Vim中的:help /[