データ:1.000000000000002
、0.999999999999999
期待される出力:1.0..02
Matlabで擬似コードを切り捨てるための別の速記に0.9..9
置き換えることができます。..
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
- 文字列に変換/変換
num2str
し、17ビット精度を持ちます。 - 正規表現を使用して、
regexprep
文字列をstr
一致に置き換えることができます。つまり、0 文字と 9 文字の両方が 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 の一部の実装では、正規表現 (例: の実装) を拡張としてサポートしていません。これは/sed
オプション(別の非標準拡張)を使用できるGNUの場合です。-r
-E
sed -E 's/([09])\1{2,}/\1..\1/g'
Perlと互換性のある正規表現は次のように動作します。MATLAB正規表現もサポートしています。、さらにサポート名前付き逆参照図perl
。