我有
print $str;
abcd*%1234$sdfsd..#d
字符串始终只有一个连续的数字,例如1234
。休息全部将是字母或其他特殊字符。
如何提取数字(在这种情况下为1234
)并将其存储回str
?
This page建议我使用\d
,但是如何使用?
答案 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;
tr
将c
0-9
实施内容中的所有字符全部转换为空,d
将它们排除在外。
对这种方法的一个警告,和菲利普波特的说法是,如果在字符串的下方还有另一组数字,它们将与第一组数字连接起来。所以你不清楚你想要这样做。
获得一组且只有一组数字的万无一失的方法是
( $str ) = $str =~ /(\d+)/;
列表上下文中的匹配返回捕获列表。围绕$str
的parens只是将表达式放在列表上下文中,并将第一个捕获分配给$str
。
答案 3 :(得分:1)
就个人而言,我会这样做:
$s =~ /([0-9]+)/;
print $1;
$ 1将包含与给定正则表达式匹配的第一个组(圆括号中的部分)。