2014-09-02 2 views
0

단일 행 문자열 $ a1과 별도로 N + 1 부분을 얻고 싶습니다. $ a1의 첫 번째 부분에는 문자가 포함되어 있고, 숫자, 쉼표, 단일 공백 ​​또는 연속이 포함될 수 있습니다 여러 공백. 파트 2 ~ 파트 N + 1의 경우 숫자 만 들어 있습니다.perl은 줄 내에서 마지막 N 번 일치를 얻습니다.

#  (part1)      (part2) (part3) (part4) 
my $a1=' adf baifdhi ads 1882, 3 123  456  7'; 

$a1 =~ /^(.*)(\s+\d+){$N}$/; 
$part1 = $1; (no problem here) 

하지만 part2의 번호는 어떻게 얻을 수 있습니까? $ 2는 나에게 마지막 경기 만 나타납니다. 감사합니다.

답변

2

(...){5}이 반복되는 캡처 그룹은 마지막 값만 반환합니다.

는 모든 값을 얻을 반복 표현 ((?:...){5}) 주위에 캡처 그룹을 사용하고 split하려면

use strict; 
use warnings; 

#  (part1)      (part2) (part3) (part4) 
my $a1 = ' adf baifdhi ads 1882, 3 123  456  7'; 
my $N = 3; 

if ($a1 =~ /^(.*)((?:\s+\d+){$N})$/) { 
    my $part1 = $1; 
    my @numbers = split ' ', $2; 

    use Data::Dump; 
    dd $part1; 
    dd @numbers; 
} 

출력을 :

" adf baifdhi ads 1882, 3 " 
(123, 456, 7) 
1

당신이의 필드를 분할 할 경우 끝 부분에 십진수 만 있으면 split을 사용하여 모두 할 수 있습니다. 이

use strict; 
use warnings; 
use 5.010; 

my $a1 = ' adf baifdhi ads 1882, 3 123  456  7'; 

my @fields = split /\s+(?=[\d\s]+\z)/, $a1; 

print "$_\n" for @fields; 

출력이 캡처 그룹에 여러 일치를 사용하는 경우, 당신은 단지 캡처의 마지막 반복을 캡처 할 수

adf baifdhi ads 1882, 
3 
123 
456 
7 
0

주처럼.

참고 : ^(.*)(\s+\d+){3}$

예는 두 번째 caputure 그룹은 ' 7'

Demo

공지 사항 Regex101에 참고가 될 것입니다 반복 캡처 그룹은 마지막 반복을 캡처합니다. 모든 반복을 캡처하는 반복 그룹 주위에 캡처 그룹을 넣어 또는 캡처 지금 ^(.*)((?:\s+\d+){3})$의이 수정을 넣을 경우 데이터

에 관심이있어 대신하는 경우 비 캡처 그룹을 사용 " 123 456 7"((?:\s+\d+){3})

Demo

의 캡처 그룹으로 그 전체 그룹 비 캡처 그룹 (?:\s+\d+){3}의 반복 패턴으로 바꾸어 다음으로 바꾸어 제 포획 기

use Data::Dump; 

#  (part1)      (part2) (part3) (part4) 
my $a1=' adf baifdhi ads 1882, 3 123  456  7'; 
my $N=3; 

$a1 =~ /^(.*)((?:\s+\d+){$N})$/; 

dd $1; 
# " adf baifdhi ads 1882, 3 " 
dd $2; 
# " 123  456  7" 

당신은 또한 분할 할 수있는 두 부분 :

my ($first, $second)=(split /^(.*)((?:\s+\d+){$N})$/, $a1)[-2,-1]; 

if ($first && $second){ 
    print "$first\n$second"; 
} 
691,363,210

그래서 코드는 거의 권리

관련 문제