2012-03-19 4 views
0

기본적으로 끝에 나타나는 하나 이상의 숫자에서 특정 양의 텍스트를 분리하려고합니다. 후행 숫자가 하나 있지만 두 개 이상일 때가 아니라면 아래가 작동합니까? "P_TIME12"에서 "12"를 가져 오지 않아야합니까?후행 숫자를 얻는 펄 정규식

word ABC digits 1 
word DFRES digits 3 
word TIME1 digits 2 

에서

my @strs = ('P_ABC1','P_DFRES3','P_TIME12'); 
foreach my $str (@strs) { 
     if ($str =~ /^P_(\w+)(\d+)$/) { 
       print "word " . $1 . " digits " . $2 . "\n"; 
     } 
} 

결과 TIA

+0

사용은'\ pL'은 문자가 아닌'\의 w'하였습니다. – tchrist

답변

0

을 사용하고 밑줄, \d+

에 대한 한 정도로 좋다. 적어도 하나의 숫자 (\ d +)를 요구했기 때문에, \ w는 탐욕스럽고 일치하는 숫자입니다.

\w보다 분명해야하며 대신 /^P_([A-Za-z_]+)(\d+)$/을 사용해야합니다.

+1

감사합니다. 정확히 내가 필요한 것! – Analog

1

\w이 숫자를 포함하는 유일한 자리는 끝

\w+이다 욕심, 그것은 것입니다 첫 경기에서 경우, 대신 [_a-zA-Z]를 사용 전체 단어와 \d+에 아무것도 남기지 않으므로 1 문자와 마지막 문자를 역 추적해야합니다. 당신이 게으른 연산자를 원하는 경우 TER는 중간에 숫자를 가지고 있기 때문에, 숫자를 포함하여, 일치 "단어 문자"w \ ^P_(\w+?)(\d+)$

1
/^P_(\D+)(\d+)$/ 

문자 클래스 \d 일치 숫자; 그것의 부정은 \D 다른 모든 것과 일치합니다. 당신은 또한 첫 번째 부분에 공백을 캡처하는

1

이 경우는 허용, 간단한 해결책은 후행 번호 전에 아무것도 ungreedily 일치 후미 번호가 탐욕하는 것입니다.

첫 번째 부분의 짝수를 일치시킬 수있는 이점이 있습니다 (단, 끝에 표시되지 않는 경우). 공백은 이미 말한 바와 같습니다. 생산

my @strs = qw(P_1ABC1 P_DFRES3 P_3TIME12); 
foreach (@strs) { 
    if (/^P_(.*?)(\d+)$/) { 
     print ">$1<", "\t\t", ">$2<", "\n" 
    } 
} 

:이다

>1ABC<  >1< 
>DFRES<  >3< 
>3TIME<  >12<