Perl正则表达式捕获内容

时间:2014-06-30 06:35:43

标签: regex perl

以下是我用来捕获秒的脚本

use strict;
use warnings;

my $n='Created posting 187294181 (sny/sny_AF8F46748A50416A9F1FF2BD7) in 0.261 secs';
my $m='Created posting 187294183';


if($n=~/Created\s+(resume|posting)\s+(\d+).*?([\d\.]*)/i)
{
   print "$1 $2 $3\n";
}
我得到3美元的空白。任何人都可以帮助我在正则表达式中做了什么错误来捕获秒。$ m和$ n应该匹配正则表达式。

输出:

posting 187294181 

1 个答案:

答案 0 :(得分:1)

使用此正则表达式:

(resume|posting) (\d+)(?:.*?in ([\d.]+) secs)?

the demo中,检查右侧窗格中的捕获组。

在您的Perl代码中:

if ($subject =~ m/(resume|posting) (\d+)(?:.*?in ([\d.]+) secs)?/i) {
   # We matched!
   print "$1 $2";
   # Is Group 3 set? 
   if (defined $3) { print "$3"; }
   print "\n";
}

<强>解释

  • (resume|posting)会将resumeposting捕获到第1组。
  • (\d+)将数字捕获到第2组。
  • (?:打开我们的可选非捕获组
  • .*?懒惰地将字符匹配到....
  • 文字in,然后
  • ([\d.]+)我们抓住了第3组的时间
  • 匹配文字字符secs
  • )?关闭非捕获组并使其成为可选