我的第一个问题是,我需要搜索两组连续的括号,例如, (log dkdkdkd)(log edksks)
下面的代码解决了第一个问题:
^\([^)]*\) \([^)]*\)$
第二个问题,除了使用上面的解决方案之外,我需要在日志之后捕获文本:
^\(log (.*)\) \(log (.*)\)$
但是上面的解决方案不起作用,因为它找到了两组以上的括号,例如:
(log dkdkdkd) (log edksks) (log riwqoq)
我真正需要的是在日志文本之后捕获文本时找到两组连续的括号?
答案 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 (.*?)\)/
说.*?
而不是.*
会使正则表达式引擎尝试将模式与所需的最少字符数相匹配。