如何捕获Perl中字符串末尾的数字组?

时间:2010-02-17 19:24:52

标签: regex perl capture

我正在尝试捕获正则表达式组中此行中的最后一位数字:

输入:

9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       54654

我的模式:

/Power_On_Hours.+Always\s.+([0-9]{1,5})/

我似乎无法捕获“54654”,它正在返回undef :(

7 个答案:

答案 0 :(得分:9)

实际上,捕获组应该抓住'4',而不是取消。你的最终.+将占用所有内容,直到最后一位数,然后将其捕获到$1。此修订版捕获$1的所有数字:

/Power_On_Hours.+Always\s.+?(\d{1,5})/

?使.+非贪婪,因此它会匹配字符(\d)开始匹配时的字符。

答案 1 :(得分:4)

正如Friedo所指出的那样,问题是您的上一个.+是贪婪的(默认行为),您可以通过将其更改为.+?来修复它。

但我可能会使用$来匹配行尾,所以:

/Power_On_Hours.+Always.+?(\d+)$/

答案 2 :(得分:1)

#!/usr/bin/perl

use strict; use warnings;

my $s = q{9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       54654};

my ($interesting) = $s =~ /([0-9]{1,5})\z/;
print "$interesting\n";

答案 3 :(得分:1)

如果您的数字始终为最后一位,

$string= q(9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       54654);
@s = split /\s+/,$string;
print $s[-1]."\n";

如果最后的数字可以是任何长度

/.+Power.+Always.+[^\d](\d+)$/;

答案 4 :(得分:1)

您也可以使用以下代码,

use strict;
use warnings;

my $string= q(9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       54654);
my @array = split /\s+/,$string;

print "$array[$#array]\n";

答案 5 :(得分:0)

该行的最后一组数字,对吗?

my ($digits) = $input =~ /(\d+)$/;

$符号将一个或多个数字(\d+)的组锚定到字符串的末尾。

答案 6 :(得分:0)

(?:Power_On_Hours.+Always\D*)(\d+)

这对我有用

http://regex101.com/r/oS8sO5