1

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

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

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

4

2 回答 2

12

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

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

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

于 2013-10-10T09:29:04.357 回答
4

Vim 确实支持像 Perl 中的“集合”,使用相同的 [..] 语法。即使在 Perl 中,你也不要把 | 在集合内,除非您想匹配文字 | 特点。

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

因此,在您的特定情况下,您可能想要:[-[:alnum:]_]\+

这包括“-”、“_”、数字和字母。更多细节请参见:help /[Vim。

于 2013-10-10T14:32:50.897 回答