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

3

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

输入内容:

9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       54654

我的模式:

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

我似乎无法捕获“54654”,它返回未定义值:(

7个回答

9

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

/Power_On_Hours.+Always\s.+?(\d{1,5})/
? 的作用是使 .+ 变成非贪婪模式,这样它只匹配字符直到数字 (\d) 开始匹配为止。

Friedo,你是我的救星啊朋友。就这样! - JPerkSter

4
如friedo所指出的,问题在于你的最后一个.+是贪婪模式(默认行为),你可以通过将其更改为.+?来解决这个问题。
但我可能会使用$来匹配行尾, 因此:
``` $ grep '^foo.*bar$' file.txt ```
/Power_On_Hours.+Always.+?(\d+)$/

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";

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";

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+)$/;

0

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

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

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接