정규식에서 이 LookBehind 작업을 어떻게 수행할 수 있나요?

정규식에서 이 LookBehind 작업을 어떻게 수행할 수 있나요?

데이터: 1.000000000000002, 0.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.

관련 정보