如何使用perl

时间:2015-08-17 16:27:58

标签: perl

我的第一个问题是,我需要搜索两组连续的括号,例如,          (log dkdkdkd)(log edksks)

下面的代码解决了第一个问题:

      ^\([^)]*\) \([^)]*\)$

第二个问题,除了使用上面的解决方案之外,我需要在日志之后捕获文本:

       ^\(log (.*)\) \(log (.*)\)$

但是上面的解决方案不起作用,因为它找到了两组以上的括号,例如:

           (log dkdkdkd) (log edksks) (log riwqoq)

我真正需要的是在日志文本之后捕获文本时找到两组连续的括号?

2 个答案:

答案 0 :(得分:4)

你可以告诉Perl" log"之后的文本。不包含(

/^\(log ([^(]*)\)\s*\(log ([^(]*)\)$/

或者,如果可以(并且您只想排除(log,请分两步检查:

for my $s ('(log this) (log matches)',
           '(log these) (log do) (log not)'
          ) {
    my @matches = $s =~ /^\(log (.*)\)\s*\(log (.*)\)$/;
    next if $matches[0] =~ /\(log /; # More than 2 logs, skip.

    say "($_)" for @matches;
}

答案 1 :(得分:0)

您可以使用非贪婪的搜索

/^\(log (.*?)\) \(log (.*?)\)/

.*?而不是.*会使正则表达式引擎尝试将模式与所需的最少字符数相匹配。