Como fazer isso LookBehind in Regex?

1

Dados: 1.000000000000002 , 0.999999999999999
Saída esperada: 1.0..02 , 0.9..9 , onde você pode substituir .. por qualquer outra abreviação para corte. Pseudocódigo no 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. você tem um float float_thing
  2. você converte / converte-o para string por num2str com precisão de 17 dígitos
  3. você usa a expressão regular por regexprep , em que substitui a string str pela correspondência [09]{3,} , ou seja, todos os caracteres de zeros e nines cuja contagem é de pelo menos três, com a substituição 0..0 e 9..9 , respectivamente
    • a última parte deve ser possível onde você deve usar o lookBehind, possivelmente na última parte

Ambas as respostas funcionam

Versão do Matlab baseada na resposta de Stephane e docs

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

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

Sistema: Linux Ubuntu 16.04
Idiomas: Perl, Matlab, Unix, Bash, Python, ...

    
por Léo Léopold Hertz 준영 08.08.2016 / 16:32

1 resposta

3

E sobre:

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

Isso é um [09] seguido por si mesmo ( sendo uma referência anterior para o [09] capturado no grupo de captura \([09]\) ) repetido 2 ou mais vezes. Observe que é diferente de [0-9]\{3,\} , que corresponderia a 0000 , mas também 0909 .

Nem todas as sintaxes de expressões regulares suportam referências anteriores. As Expressões Regulares Básicas padrão usadas por sed do, Expressões Regulares Estendidas (como em egrep ) não fazem algumas implementações do ERE suportá-las como uma extensão. Esse é o caso do GNU sed com a opção -r / -E (outra extensão não padrão) com a qual você pode usar sed -E 's/([09]){2,}/../g' aqui.

O Perl e as expressões regulares compatíveis funcionam, e parece que o suporte para expressões regulares do MATLAB eles também , e até mesmo suportam chamado backreferences como em perl .

    
por 08.08.2016 / 17:00