2014-03-01 2 views
0

안녕하세요 저는 매우 제한된 지식을 다루는 어려운 정규 표현식을 다루었습니다. 누군가가 나 같은 문제를 interprete하는 방법을 이해하도록 할 수 있다면 그것은 좋은 것 :숫자 시퀀스를 처리하기위한 복잡한 정규 표현

설명 : 내가 정규식을 마련 할 것 같은 1234567 같은 숫자의 문자열 주어진 출력합니다 결과 :

12 
23 
34 
45 
56 
67 

직접적인 해결책을 요구하지 않고 오히려 지침이 될 것입니다.

답변

1

, 당신은 할 수 :

echo 1234567|perl -ne 's/(?<!^)(.)(?!$)/$1\n$1/g; print;' 

(?<!^)negative look-behind assertion (문자열 ^의 시작을 위해)이다. (?!$)은 음수의 미리보기 어설 션입니다 (문자열 $ 끝). 정규 표현식은 처음과 마지막을 제외한 모든 문자와 일치합니다. 대치하면 일치하는 문자가 중간의 개행 문자와 반복됩니다.

+0

- 문자를 반복 할 생각하지 않았다. +1 –

0

정규식은 아무 것도 출력하지 않으므로 일치하는 텍스트를 찾습니다. 나는 당신의 '산출물'이 실제로 모든 경기의 목록이라고 생각합니다.

그래서 검색 텍스트에서 모든 숫자 쌍을 찾을 정규식이 필요합니다.

1

당신은 어떤 언어를 사용하고 있는지 밝히지 않았지만 긍정적 인 선견자를 지원한다고 가정합니다. 여기

자바의 솔루션입니다 :

public static void main(final String[] args) throws Exception { 
    final String in = "1234567"; 
    final Pattern patt = Pattern.compile("(?=(\\d{2}))."); 
    final Matcher matcher = patt.matcher(in); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 
} 

출력 :

12 
23 
34 
45 
56 
67 

패턴은 (는 언어 구문을 이유로 자바의 \\ 필요) (?=(\d{2})).입니다.

설명 :

  • (?=(\d{2}))이 용액의 고기이고 그것이 입력 String의 현재 위치 아래 두 자리를 확인하는 긍정적 예측 주장하고, 조금 까다로운. 그 다음 두 자릿수를 가져옵니다.이 부분이 "출력"의 출처입니다.
  • . 이것은 어떤 문자와도 일치합니다 (\d 일 수도 있지만 필수는 아닙니다). 이렇게하면 정규식 엔진이 한 번에 한 공간을 따라 이동합니다.

그래서 초기에 엔진은 String의 시작 부분입니다. 어설 션은 12이고, .이며,1입니다. 이제 엔진은 1 이후이며 어설 션은 23을 캡처하고 .을 캡처하고2을 사용합니다. 기타 ...

어설 션은 한 번에 두 개의 문자를 캡처하지만 패턴은 한 번에 한 문자 씩 앞으로 나아갑니다.

이 한 줄은 검색이 아닌 교체를 않습니다 - 자바에서 String들 불변 결과가 실제로 다른 String 그래서 - String in이 조작에 의해 수정되지 않습니다 : 여기에

public static void main(final String[] args) throws Exception { 
    System.out.println("1234567".replaceAll("(?=(\\d{2})).(?=\\d{2})", "$1\n")); 
} 

우리가 필요로하는 이 후 적어도 두 자리 이상 더 소비해야한다는 또 다른 주장을 추가하십시오.출력 :

펄에서
12 
23 
34 
45 
56 
67 
1

이는 펄 하나 라이너뿐만 아니라 할 것입니다 :

꽤 깔끔한
echo 1234567 | perl -ne "$\=$/; print for $_=~/(?=(\d\d))/g"