2012-03-19 11 views
0

私は基本的に、最後に表示される1つ以上の数字から特定の量のテキストを分離しようとしています。 1つの末尾の数字があるが、2つ以上の数字があるときは、以下のように動作しますか? "P_TIME12"に "12"を入れてはいけないのですか?末尾の数字を取得するperl正規表現

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+

ためenought良いです。あなたは少なくとも1桁(\ 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< 
関連する問題