数据:1.000000000000002
,0.999999999999999
预期输出:1.0..02
,0.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')
- 你有一个漂浮物
float_thing
- 您将其转换/转换为字符串 by
num2str
并具有 17 位精度 - 您可以使用正则表达式,
regexprep
将字符串替换str
为匹配项,即计数至少为 3 的所有零和九字符,分别[09]{3,}
替换为0..0
和9..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
。
并非所有正则表达式语法都支持反向引用。sed
do、Standard使用的标准基本正则表达式扩展egrep
尽管 ERE 的某些实现不支持正则表达式(如 中的)将其作为扩展。这就是 GNU 的情况,您可以在此处使用/sed
选项(另一个非标准扩展)。-r
-E
sed -E 's/([09])\1{2,}/\1..\1/g'
Perl 和兼容的正则表达式可以,看起来像MATLAB 正则表达式也支持它们,甚至支持命名反向引用像perl
。