문제

나는 그룹을 사용하여 특정 패턴에 맞추려고 노력하고 있으며 내가 기대하는 결과를 얻지 못하고 있습니다. 관심 패턴은 다음과 같습니다.

([0-9]+(\.[0-9]+)+)

문자열 용 1.23, 나는 얻다 $1=1.23, 그리고 $2=.23 나에게 의미가 있습니다.

그러나 현악기 1.2.3, 나는 얻다 $1=1.2.3 그리고 $2=.3, 내가 기대할 수있는 곳 $2=.2.3, 그룹은 소수점이자 숫자이기 때문에 반복됩니다.

누군가 이것이 어떻게 작동하는지 설명해 주시겠습니까? 고맙습니다!

도움이 되었습니까?

해결책 2

"이러한 패턴 매치 변수는 스칼라이며, 따라서 단일 값만 보유합니다. 그 값은 캡처 괄호가 일치하는 모든 것입니다. 마지막."

http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html

예에서 $1 성냥 1.2.3. 패턴이 반복됨에 따라 $2 설정됩니다 .2 마지막 경기까지 .3

다른 팁

수량 자로 캡처 그룹을 사용할 때 마지막 캡처 된 패턴의 반복이 저장됩니다.

아마도이 정규식은 당신의 요구를 충족시킬 것입니다.

\b(\d+)((?:\.\d+)+)\b

이 REGEX는 주요 정수 시퀀스를 반복되는 분수 성분과 분리합니다.

(@ysth가 표시 한대로 \d 5월 더 많은 캐릭터와 일치합니다 당신이 의도하는 것보다. 이 경우 캐릭터 클래스를 사용하십시오. [0-9] 대신 또는 사용하십시오 /a 수정 자.)

다음은 샘플 데이터 세트 에서이 Regex를 보여주는 PERL 프로그램입니다. (또한 참조 라이브 데모.)

#!/usr/bin/perl -w

use strict;
use warnings;

while (<DATA>) {
    chomp;

    # A - A sequence of digits
    # B - A period and a sequence of digits
    # C - Repeat 'B'.

    if (/\b(\d+)((?:\.\d+)+)\b/) {
#           ^^^     ^^^^^
#            A        B
#                   ^^^^^^^
#                      C

        print "[$1]  [$2]\n";
    }
}

__END__
1.23
123.456
1.2.3
1.22.333.444

예상 출력 :

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top