2010-02-17 32 views
3

我试图捕捉到这一行的最后一个数字的正则表达式组:如何在Perl中捕获字符串末尾的数字组?

输入:

我的模式
9 Power_On_Hours   0x0032 099 099 000 Old_age Always  -  54654

:我只是不能似乎

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

得到它捕获“54654”,它是undef :(

回答

9

其实,捕获g群应抓住'4',而不是undef。你的最终.+会吃掉一切,直到最后一位数字,然后将其捕获到$1。本次修订捕获所有的数字来$1

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

?使.+非贪婪的,所以它会匹配字符最多时数字(\d)开始匹配。

+0

Friedo,你是神我的朋友。而已! – JPerkSter

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

正如friedo指出的那样,问题在于您最近的.+是贪婪(默认行为),您可以通过将其更改为.+?来修复它。

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

/Power_On_Hours.+Always.+?(\d+)$/ 
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+),到字符串的末尾。

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