Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Vim中捕获字符串中的所有事件?_Regex_String_Vim_Replace_Capture - Fatal编程技术网

Regex 如何在Vim中捕获字符串中的所有事件?

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和正则表达式,但试了又试,还是没能解决 试试看:

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

例如:

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的解决方案对我在问题中提出的替换很有用,但我认为使用您的正则表达式也是可能的。