【发布时间】:2010-02-17 19:24:52
【问题描述】:
我正在尝试在正则表达式组中捕获此行中的最后一位数字:
输入:
9 Power_On_Hours 0x0032 099 099 000 Old_age 始终 - 54654
我的模式:
/Power_On_Hours.+Always\s.+([0-9]{1,5})/
我似乎无法让它捕获“54654”,它正在返回 undef :(
【问题讨论】:
我正在尝试在正则表达式组中捕获此行中的最后一位数字:
输入:
9 Power_On_Hours 0x0032 099 099 000 Old_age 始终 - 54654
我的模式:
/Power_On_Hours.+Always\s.+([0-9]{1,5})/
我似乎无法让它捕获“54654”,它正在返回 undef :(
【问题讨论】:
实际上,该捕获组应该抓取“4”,而不是 undef。你最后的.+ 将吃掉所有的东西,直到最后一个数字,然后将其捕获到$1。此修订版将所有数字捕获到$1:
/Power_On_Hours.+Always\s.+?(\d{1,5})/
? 使 .+ 非贪婪,因此它将匹配字符直到数字 (\d) 开始匹配。
【讨论】:
正如friedo 所指出的,问题在于您的最后一个.+ 是贪婪的(默认行为),您可以通过将其更改为.+? 来修复它。
但我可能会使用$ 来匹配行尾,所以:
/Power_On_Hours.+Always.+?(\d+)$/
【讨论】:
#!/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";
【讨论】:
如果你的数字总是最后一个,
$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+)$/;
【讨论】:
你也可以使用下面的代码,
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";
【讨论】:
最后一组数字,对吧?
my ($digits) = $input =~ /(\d+)$/;
$ 符号将一个或多个数字组 (\d+) 锚定到字符串的末尾。
【讨论】:
【讨论】: