是否有可能编写一个正则表达式来匹配出现未知次数的嵌套模式?例如,当在外花括号内嵌套了未知数量的开/闭花括号时,正则表达式是否可以匹配开/闭花括号?

例如:

public MyMethod()
{
  if (test)
  {
    // More { }
  }

  // More { }
} // End

应该匹配:

{
  if (test)
  {
    // More { }
  }

  // More { }
}

当前回答

常规语言的泵浦引理是您不能这样做的原因。

生成的自动机将有有限数量的状态,比如k,所以一个由k+1个开括号组成的字符串必然在某个地方有一个重复的状态(当自动机处理字符时)。相同状态之间的字符串部分可以复制无限次,自动机不会知道其中的区别。

特别是,如果它接受k+1个开大括号,后面跟着k+1个闭大括号(它应该),它也会接受泵送的开大括号数量,后面跟着不变的k+1个闭大括号(它不应该)。

其他回答

正如zsolt提到的,一些正则表达式引擎支持递归——当然,这些引擎通常使用回溯算法,所以它不是特别有效。例子 : /(?>[^{}]*){(?>[^{}]*)(? R )*(?>[^{}]*)}/ sm

使用正则表达式检查嵌套模式非常简单。

'/(\((?>[^()]+|(?1))*\))/'

常规语言的泵浦引理是您不能这样做的原因。

生成的自动机将有有限数量的状态,比如k,所以一个由k+1个开括号组成的字符串必然在某个地方有一个重复的状态(当自动机处理字符时)。相同状态之间的字符串部分可以复制无限次,自动机不会知道其中的区别。

特别是,如果它接受k+1个开大括号,后面跟着k+1个闭大括号(它应该),它也会接受泵送的开大括号数量,后面跟着不变的k+1个闭大括号(它不应该)。

可能是Perl解决方案,如果字符串在一行上:

my $NesteD ;
$NesteD = qr/ \{( [^{}] | (??{ $NesteD }) )* \} /x ;

if ( $Stringy =~ m/\b( \w+$NesteD )/x ) {
    print "Found: $1\n" ;
  }

HTH

编辑:检查:

http://dev.perl.org/perl6/rfc/145.html Ruby信息:http://www.ruby-forum.com/topic/112084 更多perl: http://www.perlmonks.org/?node_id=660316 甚至更多perl: https://metacpan.org/pod/Text::Balanced Perl, Perl, Perl: http://perl.plover.com/yak/regex/samples/slide083.html

Torsten Marek(他已经正确地指出,它不再是一个正则表达式)的另一个观点是:

http://coding.derkeiler.com/Archive/Perl/comp.lang.perl.misc/2008-03/msg01047.html

/(\{(?:\{.*\}|[^\{])*\})/m