0

在我看来,Vimscript 没有很多用于操作字符串的功能。我经常使用matchstr(),substitute()和不经常使用strpart(). 也许还有更多。

例如,删除以下字符串中行号之间的所有文本的最佳方法是什么a

let a = "\%8l............\|\%11l..........\|\%17l.........\|\%20l...."  " etc.

我只想保留数字并将它们放在一个列表中:

['8', '11', '17', '20']  " etc.

(请注意,行号之间的文本可以不同。)

4

2 回答 2

5

您正在寻找 split()

echo split(a, '[^0-9]\+') 

编辑:

鉴于新的约束:只有来自 的数字\%d\+l,我会这样做:

echo map(split(a, '|'), "matchstr(v:val, '^%\\zs\\d\\+\\zel')")

注意:你的 vim 变量格式不正确,要只使用一个反斜杠,你需要用单引号写你的字符串。使用双引号,您需要两个反斜杠。所以,随着

let b = '\%8l............\|\%11l..........\|\%17l.........\|\%20l....'

它成为了

echo map(split(b, '\\|'), "matchstr(v:val, '^\\\\%\\zs\\d\\+\\zel')")
于 2012-04-04T08:50:00.537 回答
2

可以利用带有表达式功能的替换(请参阅 参考资料 :help sub-replace-\=)来遍历所有目标匹配,将它们附加到列表中。

:let l=[] | call substitute(a, '\\%\(\d\+\)l', '\=add(l,submatch(1))[1:0]', 'g')
于 2012-04-05T14:37:33.150 回答