1

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

例子:

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

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

如果出现这种情况,我该如何更换它们?
pe 如果在单个 '/' 之后没有 '.' 在此数字后添加“.0”

我尝试使用匹配字符串和正则表达式,但在尝试和尝试之后我无法解决它。

4

3 回答 3

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')
于 2012-05-05T10:13:59.027 回答
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
于 2012-05-05T09:44:12.413 回答
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)
于 2012-05-05T09:58:09.683 回答