如何从Perl中的字符串中提取数字?

时间:2010-08-26 12:10:45

标签: perl

我有

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

字符串始终只有一个连续的数字,例如1234。休息全部将是字母或其他特殊字符。

如何提取数字(在这种情况下为1234)并将其存储回str

This page建议我使用\d,但是如何使用?

4 个答案:

答案 0 :(得分:28)

如果您不想修改原始字符串,可以使用子图案通过在正则表达式中捕获它们来提取数字。在列表上下文中,正则表达式返回子模式中定义的匹配项。

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

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

答案 1 :(得分:18)

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

这将从字符串中删除所有非数字字符。这就是你需要做的一切。

编辑:如果其他脚本中的Unicode数字可能存在,则更好的解决方案是:

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

答案 2 :(得分:4)

如果你想以破坏性的方式去做,这是最快的方法。

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

trc 0-9实施内容中的所有字符全部转换为空,d将它们排除在外。

对这种方法的一个警告,和菲利普波特的说法是,如果在字符串的下方还有另一组数字,它们将与第一组数字连接起来。所以你不清楚你想要这样做。

获得一组且只有一组数字的万无一失的方法是

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

列表上下文中的匹配返回捕获列表。围绕$str的parens只是将表达式放在列表上下文中,并将第一个捕获分配给$str

答案 3 :(得分:1)

就个人而言,我会这样做:

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

$ 1将包含与给定正则表达式匹配的第一个组(圆括号中的部分)。