3

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

输入:

9 Power_On_Hours 0x0032 099 099 000 Old_age 始终 - 54654

我的模式:

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

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

4

7 回答 7

9

实际上,该捕获组应该抓住'4',而不是undef。您的决赛.+将吃掉所有内容,直到最后一位数字,然后将其捕获到$1. 此修订版将所有数字捕获到$1

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

使?.+贪婪,因此它将匹配字符直到数字(\d)开始匹配。

于 2010-02-17T19:35:20.920 回答
4

正如friedo指出的那样,问题在于您的最后一个.+是贪婪的(默认行为),您可以通过将其更改为.+?.

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

/Power_On_Hours.+Always.+?(\d+)$/
于 2010-02-17T19:52:26.933 回答
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";
于 2010-02-17T19:34:12.650 回答
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+)$/;
于 2010-02-18T00:59:34.620 回答
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";
于 2010-03-01T11:54:55.837 回答
0

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

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

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

于 2010-02-21T09:58:46.550 回答
0
(?:Power_On_Hours.+Always\D*)(\d+)

这对我有用

http://regex101.com/r/oS8sO5

于 2014-03-06T20:00:48.530 回答