2012-03-19 39 views
0

我想基本上試圖從最後出現的一個或多個數字中分離出特定數量的文本。當有一個尾隨號碼時,下面的工作是有效的,但是有兩個或更多的時候不是。 (\ d +)不應該在「P_TIME12」中獲得「12」嗎?perl正則表達式來獲得尾隨號碼

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

結果

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

TIA

+0

使用'\ pL'匹配的字母,而不是'\ w'。 – tchrist 2012-03-20 00:00:34

回答

0

\ W匹配「單詞字符」,包括數字和下劃線。由於您至少要求輸入一位數字(\ d +),\ w也是貪婪的,並且與之匹配。

您應該比\w更明確,並使用/^P_([A-Za-z_]+)(\d+)$/來代替。

+1

謝謝,正是我需要的! – Analog 2012-03-19 23:29:35

1

\w包含數字,使用[_a-zA-Z]代替,如果唯一的數字是在端

\w+是貪婪,它將第一匹配整個詞並沒有爲\d+留下任何東西,所以它必須回溯1個字符和最後的字符之三是\d+

到足夠好,如果你想偷懶操作,因爲你在中間有個數字,用^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<