"이러한 패턴 매치 변수는 스칼라이며, 따라서 단일 값만 보유합니다. 그 값은 캡처 괄호가 일치하는 모든 것입니다. 마지막."
http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html
예에서 $1
성냥 1.2.3
. 패턴이 반복됨에 따라 $2
설정됩니다 .2
마지막 경기까지 .3
문제
나는 그룹을 사용하여 특정 패턴에 맞추려고 노력하고 있으며 내가 기대하는 결과를 얻지 못하고 있습니다. 관심 패턴은 다음과 같습니다.
([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]