안녕하세요 저는 매우 제한된 지식을 다루는 어려운 정규 표현식을 다루었습니다. 누군가가 나 같은 문제를 interprete하는 방법을 이해하도록 할 수 있다면 그것은 좋은 것 :숫자 시퀀스를 처리하기위한 복잡한 정규 표현
설명 : 내가 정규식을 마련 할 것 같은 1234567
같은 숫자의 문자열 주어진 출력합니다 결과 :
12
23
34
45
56
67
직접적인 해결책을 요구하지 않고 오히려 지침이 될 것입니다.
안녕하세요 저는 매우 제한된 지식을 다루는 어려운 정규 표현식을 다루었습니다. 누군가가 나 같은 문제를 interprete하는 방법을 이해하도록 할 수 있다면 그것은 좋은 것 :숫자 시퀀스를 처리하기위한 복잡한 정규 표현
설명 : 내가 정규식을 마련 할 것 같은 1234567
같은 숫자의 문자열 주어진 출력합니다 결과 :
12
23
34
45
56
67
직접적인 해결책을 요구하지 않고 오히려 지침이 될 것입니다.
, 당신은 할 수 :
echo 1234567|perl -ne 's/(?<!^)(.)(?!$)/$1\n$1/g; print;'
(?<!^)
는 negative look-behind assertion (문자열 ^
의 시작을 위해)이다. (?!$)
은 음수의 미리보기 어설 션입니다 (문자열 $
끝). 정규 표현식은 처음과 마지막을 제외한 모든 문자와 일치합니다. 대치하면 일치하는 문자가 중간의 개행 문자와 반복됩니다.
정규식은 아무 것도 출력하지 않으므로 일치하는 텍스트를 찾습니다. 나는 당신의 '산출물'이 실제로 모든 경기의 목록이라고 생각합니다.
그래서 검색 텍스트에서 모든 숫자 쌍을 찾을 정규식이 필요합니다.
당신은 어떤 언어를 사용하고 있는지 밝히지 않았지만 긍정적 인 선견자를 지원한다고 가정합니다. 여기
자바의 솔루션입니다 :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
이는 펄 하나 라이너뿐만 아니라 할 것입니다 :
꽤 깔끔한echo 1234567 | perl -ne "$\=$/; print for $_=~/(?=(\d\d))/g"
- 문자를 반복 할 생각하지 않았다. +1 –