【问题标题】:How can I capture the group of digits at the end of a string in Perl?如何在 Perl 中捕获字符串末尾的数字组?
【发布时间】: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 :(

【问题讨论】:

    标签: regex perl capture


    【解决方案1】:

    实际上,该捕获组应该抓取“4”,而不是 undef。你最后的.+ 将吃掉所有的东西,直到最后一个数字,然后将其捕获到$1。此修订版将所有数字捕获到$1

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

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

    【讨论】:

    • 弗里多,你是上帝,我的朋友。就是这样!
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      #!/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】:

        如果你的数字总是最后一个,

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

        【讨论】:

          【解决方案5】:

          你也可以使用下面的代码,

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

          【讨论】:

            【解决方案6】:

            最后一组数字,对吧?

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

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

            【讨论】:

              【解决方案7】:
              (?:Power_On_Hours.+Always\D*)(\d+)
              

              这对我有用

              http://regex101.com/r/oS8sO5

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-11-05
                • 2010-09-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多