我想捕获Vimscript中字符串中的所有特定事件。
示例:
let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'
如何在'/'之前和之后捕获所有数字(包括有点数)?在2个不同的变量中:
- 输出before_slash:200100.5200
- 斜线332后的输出
如果出现这种情况,我该如何更换它们? 体育如果在单个'/'之后没有'。'在此号码后添加'.0'
我尝试使用matchstring和regex但是在尝试并尝试后我无法解决它。
答案 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)