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

Ale*_*lex 0 vim

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

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

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

Ing*_*kat 8

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

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

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