什么是使用perl连续找到两组括号的正则表达式?

时间:2015-08-11 18:17:57

标签: regex perl

我的行有不同的括号。例如

     (sdfsfs) (sfdsfd) 
     (sdfsfs) (sfdsfd) (sfdsfd) 
     (sdfsfs) (sfdsfd) (sfdsfd) (sfdsfd)
     (sdfsfs) (sfdsfd) (sfdsfd) (sfdsfd) (sfdsfd)
     (sdfsfs) (sfdsfd) (sfdsfd) (sfdsfd) (sfdsfd) 

正则表达式只能找到包含两组括号的行?在上面的例子中,第一行。

试试这个正则表达式时

/\(.*\) \(.*\)/

返回所有行

3 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式来匹配具有2个括号集的行:

m/^(\([^)]*\)\s*){2}$/

OR:

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

RegEx Demo

[^)]*将匹配)以外的任何字符,效率高于.*?.*

答案 1 :(得分:1)

这是一个更好的解决方案。

while ( $text =~ //(?m)^(?=(?:.*?(?&parens)){2})(?!(?:.*?(?&parens)){3}).+$(?(DEFINE)(?<parens>\([^)\n]*\)))/g )
{
    print $&,"\n";
}

Formatted:

 (?m)                          # Multi-line mode
 ^                             # BOL
 (?=                           # Must be 2 paren's blocks
      (?:
           .*? (?&parens) 
      ){2}
 )
 (?!                           # Cannot be 3 paren's blocks
      (?:
           .*? (?&parens) 
      ){3}
 )
 .+                            # Get the entire line
 $                             # EOL

 (?(DEFINE)
      (?<parens> \( [^)\n]* \) )    # (1)
 )

答案 2 :(得分:0)

^(?:\s*\([^\)(]*\)\s*){2}$

您可以使用锚定义此模式。参见演示。

https://regex101.com/r/eX9gK2/10