Regex 如何在Vim中捕获字符串中的所有事件?
我想在Vimscript中捕获字符串中的所有特定事件 例如:Regex 如何在Vim中捕获字符串中的所有事件?,regex,string,vim,replace,capture,Regex,String,Vim,Replace,Capture,我想在Vimscript中捕获字符串中的所有特定事件 例如: let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)' 如何捕获“/”前后的所有数字(包括点,如果有)?在两个不同的变量中: -斜杠前输出:200100.5200 -斜杠332后的输出 如果出现状况,我如何更换它们? p、 e.如果在单个“/”之后没有“.”,请在此数字之后添加“.0” 我试着使用matchstring和正则表达式,但试了又试,还是没能解决 试试看:
let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'
如何捕获“/”前后的所有数字(包括点,如果有)?在两个不同的变量中:-斜杠前输出:200100.5200
-斜杠332后的输出 如果出现状况,我如何更换它们?
p、 e.如果在单个“/”之后没有“.”,请在此数字之后添加“.0” 我试着使用matchstring和正则表达式,但试了又试,还是没能解决 试试看:
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
尝试一下:
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
回答问题的第二部分:
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)
回答问题的第二部分:
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)
在这种情况下,可以利用的一个有用特性是替换 带有表达式(请参见
:help sub replace-\=
)
在这种情况下,可以利用的一个有用特性是替换 带有表达式(请参见
:help sub replace-\=
)
也许它会帮助你
my$str='200/3+23+100.5/3-2+4*(200/2)'@配对=($str=~m/(\d+)\/(\d+)/g);我的$left=“”;我的$right=“”;当(@pair){$left.=shift@pair;$right.=shift@pair;}
perl代码时,只需要一些检查。也许它会帮助您my$str='200/3+23+100.5/3-2+4*(200/2)'@配对=($str=~m/(\d+)\/(\d+)/g);我的$left=“”;我的$right=“”;虽然(@pair){$left.=shift@pair;$right.=shift@pair;}
perl代码,但需要一些检查。非常感谢您的好解决方案。非常感谢您的好解决方案。@remann:相应地,包含捕获的分子和分母的列表。非常好的正则表达式。我会记住的。它发现Creemama的解决方案对我在问题中提出的替换很有用,但我想它也可以用于正则表达式。@Remonn:相应地包含捕获的分子和分母的列表。非常好的正则表达式。我会记住的。它发现Creemama的解决方案对我在问题中提出的替换很有用,但我认为使用您的正则表达式也是可能的。