我有一个vimscript,它从vim命令行传递的字符串中获取匹配列表。字符串的一部分具有类似some-word
的模式。以下输出总结了问题:
echo matchlist("some-word", escape('(\w|-)+', '()+|'))
" => ['some-word', 'd', '', '', '', '', '', '', '', '']
我知道'd'
是由捕获组引起的。我尝试使用[\w|-]
,但这不起作用。我发现避免这种情况的一种方法是使用非捕获组\%(\w|-)
,但似乎添加了更多代码。 vim在perl中没有像[]
这样的解决方案吗?
答案 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 /[
。