正規表現でこのLookBehind操作をどのように実行できますか?

正規表現でこのLookBehind操作をどのように実行できますか?

データ:1.0000000000000020.999999999999999
期待される出力:1.0..02Matlabで擬似コードを切り捨てるための別の速記に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')
  1. あなたはプロッタを持っていますfloat_thing
  2. 文字列に変換/変換num2strし、17ビット精度を持ちます。
  3. 正規表現を使用して、regexprep文字列をstr一致に置き換えることができます。つまり、0 文字と 9 文字の両方が 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 で使用される標準基本正規表現拡大するegrepERE の一部の実装では、正規表現 (例: の実装) を拡張としてサポートしていません。これは/sedオプション(別の非標準拡張)を使用できるGNUの場合です。-r-Esed -E 's/([09])\1{2,}/\1..\1/g'

Perlと互換性のある正規表現は次のように動作します。MATLAB正規表現もサポートしています。、さらにサポート名前付き逆参照perl

おすすめ記事