2010-08-26 484 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