2012-05-11 55 views
3

我有一個這樣的字符串:的Perl - 返回最後一個字母字符最後一位數字後的字符串,返回修改後的字符串也

$var = '123456d'; 

或可能

$var = '123456'; # (no alpha char) 

多達6將有數字如果有關的話不少於5。 沒有字母,空格或數字中特殊的混合。

在我的Perl腳本中,我需要刪除並返回最後一個字母字符和沒有字母字符的字符串。

我想可以使用\ D和修剪?或砍?但是,必須有一個簡單的方法來快速獲得兩個變量。

my $numbers =~ s/\D+?$var//; #??? 

my $alpha = substr($var, 0, -1); ## but no alpha check. 

my $alpha = chop($var); ## but no alpha check. 

然後如果-Z等,以檢查它是否是一個字母字符。

還是我的能力的解決方案的限制:

$alpha = $var; 
$alpha =~ s/[0-9]//ig; 
$var =~ s/[a-Z]//ig; 
$numbers = $var; 

這樣的結果是:

($numbers == '123456') 
($alpha eq 'd') (or '' if nothing) 

我覺得這是太微不足道了問在這裏,但我就是無法找到或編寫適用的解決方案。

我對=〜s的使用只是一個猜測,但是,必須有更好的方法,甚至是一個班輪。

感謝這裏所有的幫助...

SORRY思想後!數字後面可能有2個字母!他們將需要一起返回爲一個單一的VAR($阿爾法EQ 'DD')

我發現這太TO0:

$var =~ s{^([0-9]+).*}{$1}i; 
+0

範圍'[A-z]'是嚴重錯誤。對於字母字符,你應該寫'\ p {alpha}',就夠了。 – tchrist

+0

謝謝so $ var =〜s/\ p {alpha} // ig; ?? –

回答

6

使用\pL將避免捕獲數字,並使字符串可選將確保即使對於沒有結尾字母的數字也會發生匹配。

my $var = '123456d'; 
my ($num, $letter) = $var =~ /^(\d+)(\pL)?$/; 

請注意,您不能使用\w捕捉可能的結局信,因爲它也包含數字。正如tchrist指出的那樣,\p{alpha}也可以使用。

+0

我想我其實懂!我會試試這個,馬上回到你身邊。 –

+0

'(\ d +)'不會貪婪到足以防止數字在最後被捕獲?或者你在想像「12345d3」這樣的輸入? –

+0

@RobI我認爲這是最後的字母。如果它確實也可以是數字,則需要其他一些方法。 – TLP

0

也許是這樣的:

my $numbers =~ s/(\d+)(\p{alpha}+)?/$1/; 

my $alpha = $2; 

$1指的是第一個圓括號的捕獲,$2指的是第二個。

已修改:用於\d的數字,\p{alpha}的alpha。

+2

恐怕這是不準確的,因爲'\ w'是***不是*** alpha加下劃線。全部是英文字母(包括帶圓圈的字母和諸如羅馬數字的字母數字),所有組合標記,所有數字和所有連接符號。無論如何,如果你想要alpha,寫'\ p {alpha}'。 – tchrist

+0

@tchrist我似乎回想起你以前推薦過'\ pL'。 – TLP

+0

@TLP雖然在完整的技術定義(後者包括前者,但除此之外還有很多其他)之間,\ pL'和'\pα''之間有區別,我想''pL'是許多人不熟悉的東西主要是尋找。 – tchrist

相關問題