2010-08-26 481 views
8

如何從Perl中的字符串中提取數字?

print $str; 
abcd*%1234$sdfsd..#d 

字符串將始終只有一個數字的連續拉伸,就像在這種情況下1234。休息都將是字母或其他特殊字符。

如何提取數字(本例中爲1234)並將其存回str

This page建議我應該用\d,但是怎麼樣?

回答

17
$str =~ s/\D//g; 

這將刪除字符串中的所有非數字字符。這就是你需要做的一切。

編輯:如果在其他腳本中的Unicode數字可能存在,一個更好的解決方案是:

$str =~ s/[^0-9]//g; 
+1

拉澤要求的是一個數字,而不僅僅是一個整數。這個正則表達式將會放棄'''','e',它可以被用來形成一個浮點數。由於Perl中的Unicode支持,'\ d'不僅僅是'[0-9]':其他字形(如印度語)中的數字是有效的。所以你的正則表達式也會接受不是數字的字符串。 – dolmen 2010-08-26 15:43:56

+0

@dolmen Lazer應該是更具體的,然後。他的例子不包括小數或指數,我不知道他是否想要包含它們。你對unicode變體腳本數字是正確的,但是,我會編輯。 – 2010-08-26 15:53:43

26

如果你不想修改原始字符串,您可以通過捕捉它們提取號碼正則表達式,使用子模式。在列表上下文中,正則表達式返回在子模式中定義的匹配。

my $str = 'abc 123 x456xy 789foo'; 

my ($first_num) = $str =~ /(\d+)/; # 123 
my @all_nums = $str =~ /(\d+)/g; # (123, 456, 789) 
+0

+1。這比我的答案有優勢,它不假定字符串中只有一個嵌入的數字。 – 2010-08-26 12:20:51

1

就個人而言,我會做這樣的:

$s =~ /([0-9]+)/; 
print $1; 

$ 1進行包含第一組匹配給定的正則表達式(在圓括號中的部分)。

+2

除非您首先確認您的比賽成功,否則請勿使用'$ 1','$ 2'等中的值。捕獲變量只在成功匹配時重新設置,如果示例中的$ s沒有任何數字,您將得到最後一次匹配的結果。 – 2010-08-26 14:36:43

+0

哇,我多麼傻。感謝您的解釋。爲了確保我學到了我的教訓......是否使用分組變量的正確方法是:if($ s =〜/([0-9] +)/)print $ 1'? – Ziggy 2011-03-10 09:38:03

4

如果你想這樣做的破壞性的方式,這是最快的方式來做到這一點。

$str =~ tr/0-9//cd; 

tr anslate在c omplement的0-9不了了之所有字符,d elete他們。

對這種方法和Phillip Potter's的一個警告是,還有另一組數字在字符串的下面,它們將與第一組數字串聯。所以目前還不清楚你是否想要這樣做。

的正確的方式來獲得唯一一組數字是

($str) = $str =~ /(\d+)/; 

本場比賽,在列表環境中返回捕獲的列表。圍繞$str的變形只是將表達式放在列表上下文中,並將第一個捕獲指定給$str

+0

最佳答案! – dolmen 2010-08-26 15:48:42