【发布时间】:2010-08-26 12:10:44
【问题描述】:
我有
print $str;
abcd*%1234$sdfsd..#d
字符串总是只有一个连续的数字,例如 1234 在这种情况下。其余都是字母或其他特殊字符。
如何提取号码(在本例中为1234)并将其存储回str?
This page 建议我应该使用\d,但是如何使用?
【问题讨论】:
标签: perl
我有
print $str;
abcd*%1234$sdfsd..#d
字符串总是只有一个连续的数字,例如 1234 在这种情况下。其余都是字母或其他特殊字符。
如何提取号码(在本例中为1234)并将其存储回str?
This page 建议我应该使用\d,但是如何使用?
【问题讨论】:
标签: perl
如果您不想修改原始字符串,您可以通过使用子模式在正则表达式中捕获数字来提取数字。在列表上下文中,正则表达式返回子模式中定义的匹配项。
my $str = 'abc 123 x456xy 789foo';
my ($first_num) = $str =~ /(\d+)/; # 123
my @all_nums = $str =~ /(\d+)/g; # (123, 456, 789)
【讨论】:
$str =~ s/\D//g;
这会从字符串中删除所有非数字字符。这就是你需要做的所有事情。
编辑:如果其他脚本中可能存在 Unicode 数字,更好的解决方案是:
$str =~ s/[^0-9]//g;
【讨论】:
.、e,它们可用于形成浮点数。由于 Perl 中的 Unicode 支持,\d 不仅仅是[0-9]:其他字形(如印度)中的数字是有效的。所以你的正则表达式也将接受不是数字的字符串。
如果您想以破坏性的方式进行操作,这是最快的方法。
$str =~ tr/0-9//cd;
translate 将0-9 的complement 中的所有字符删除,d删除它们。
这种方法和 Phillip Potter 的一个警告是,如果在字符串后面还有另一组数字,它们将与第一组数字连接。所以不清楚你是否想要这样做。
获得一组且只有一组数字的可靠方法是
( $str ) = $str =~ /(\d+)/;
匹配,在列表上下文中返回捕获列表。 $str 周围的括号只是将表达式放在列表上下文中并将第一个捕获分配给 $str。
【讨论】:
就我个人而言,我会这样做:
$s =~ /([0-9]+)/;
print $1;
$1 将包含与给定正则表达式匹配的第一组(圆括号中的部分)。
【讨论】:
$1、$2 等中的值,除非您首先确认匹配成功。捕获变量仅在成功匹配时(重新)设置,如果您的示例中的 $s 没有任何数字,您将获得上次匹配的结果。
if($s =~ /([0-9]+)/) print $1 是使用分组变量的正确方法吗?