vimscript正则表达式:在数组中写入多个匹配项

时间:2016-02-17 12:50:05

标签: regex vim

我写了一个vim的正则表达式,它应该找到文件名。它看起来像那样:

let fileMatch = '\([-_a-zA-Z0-9]\+\.\)\+[a-zA-Z0-9]\+'
let fileName = matchstr(
    \ a:input_line,
    \ fileMatch
    \ )

我们假设a:input_line的值为:

(test/the/plugins.vim:13:2) (test/the/pluginsies.vim:13:2)

我的目标是在数组中添加plugins.vimpluginsies.vim。 我将在后面解决这个数组。

现在,如果我回显fileName,我只会得到第一个匹配:plugins.vim

那么,如何在数组中保存多个匹配?

最终解决方案

let fileMatch = '\([-_a-zA-Z0-9]\+\.\)\+[a-zA-Z0-9]\+'
let fileName = matchstr(
    \ a:input_line,
    \ fileMatch
    \ )
let result_list = map(split(a:input_line, fileMatch . '\zs'),'matchstr(v:val, fileMatch)')

1 个答案:

答案 0 :(得分:1)

matchstr()只会返回第一场比赛。您可以使用循环来获取所有匹配的字符串。

我注意到你会忽略带空格的文件名。所以这个单行可能有助于在列表中获得所有匹配的字符串:

let result_list = map(split(a:input_line),'matchstr(v:val, fileMatch)')

它将返回:

['plugins.vim', 'pluginsies.vim']