如何在正则表达式中执行此 LookBehind 操作?

如何在正则表达式中执行此 LookBehind 操作?

数据:1.0000000000000020.999999999999999
预期输出:1.0..020.9..9您可以在其中替换..
Matlab 中剪切伪代码的任何其他简写

float_thing=1.0000000000000002; % 0.999999999999999 
str=num2str(float_thing,17);
regexprep(str, '[09]{3,}' , 'SOME_lookBehind_thing_here for 0..0/9..9')
  1. 你有一个漂浮物float_thing
  2. 您将其转换/转换为字符串 bynum2str并具有 17 位精度
  3. 您可以使用正则表达式,regexprep将字符串替换str为匹配项,即计数至少为 3 的所有零和九字符,分别 [09]{3,}替换为0..09..9
    • 最后一部分应该是可能的,您可能应该在最后一部分中使用lookBehind

两个答案都有效

基于 Stephane 的答案和文档的 Matlab 版本

% http://se.mathworks.com/help/matlab/matlab_prog/tokens-in-regular-expressions.html
p=1.0000000000000002; str=num2str(p,17); regexprep(str, '([09])\1{3,}' , '$1..$1')
% 1.0..02

p=0.9999999999999999; str=num2str(p,17); regexprep(str, '([09])\1{3,}' , '$1..$1')
% 0.9..989

系统:Linux Ubuntu 16.04
语言:Perl、Matlab、Unix、Bash、Python、...

答案1

关于什么:

$ echo 1.000000000000002, 0.999999999999999, 999.000999000999|
   sed 's/\([09]\)\1\{2,\}/\1..\1/g'
1.0..02, 0.9..9, 9..9.0..09..90..09..9

这是一个[09]其后跟随的(\1是一个反向引用[09]捕获的捕获组 \([09]\)) 重复 2 次或更多次。请注意,它与[0-9]\{3,\}匹配0000但也不同0909

并非所有正则表达式语法都支持反向引用。seddo、Standard使用的标准基本正则表达式扩展egrep尽管 ERE 的某些实现不支持正则表达式(如 中的)将其作为扩展。这就是 GNU 的情况,您可以在此处使用/sed选项(另一个非标准扩展)。-r-Esed -E 's/([09])\1{2,}/\1..\1/g'

Perl 和兼容的正则表达式可以,看起来像MATLAB 正则表达式也支持它们,甚至支持命名反向引用perl

相关内容