如何在Vim中捕获字符串中的所有匹配项?

时间:2012-05-05 08:24:04

标签: regex string vim replace capture

我想捕获Vimscript中字符串中的所有特定事件。

示例:

let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'  

如何在'/'之前和之后捕获所有数字(包括有点数)?在2个不同的变量中:
- 输出before_slash:200100.5200
- 斜线332后的输出

如果出现这种情况,我该如何更换它们? 体育如果在单个'/'之后没有'。'在此号码后添加'.0'

我尝试使用matchstring和regex但是在尝试并尝试后我无法解决它。

3 个答案:

答案 0 :(得分:3)

在这种情况下可以利用的有用功能是替换 用表达式(见:help sub-replace-\=)。

let [a; b] = [[]]
call substitute(s, '\(\d*\.\?\d\+\)/\(\d*\.\?\d\+\)\zs',
\   '\=add(a,submatch(1))[1:0]+add(b,submatch(2))[1:0]', 'g')

答案 1 :(得分:2)

尝试一下:

function! GetNumbers(string)
  let pairs = filter(split(a:string, '[^0-9/.]\+'), 'v:val =~ "/"')
  let den = join(map(copy(pairs), 'matchstr(v:val, ''/\zs\d\+\(\.\d\+\)\?'')'), '')
  let num = join(map(pairs, 'matchstr(v:val, ''\d\+\(\.\d\+\)\?\ze/'')'), '')
  return [num, den]
endfunction
let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'
let [a,b] = GetNumbers(my_calculation)
echo a
echo b

答案 2 :(得分:2)

回答问题的第二部分:

let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'
echo substitute(my_calculation, '\(\/[0-9]\+\)\([^0-9.]\|$\)', '\1.0\2', 'g')

以上输出:

200/3.0 + 23 + 100.5/3.0 -2 + 4*(200/2.0)