许多正则表达式实现不允许您匹配任意数量的嵌套。但是,Perl,PHP和.NET支持递归模式。
Perl的一个演示:#!/usr/bin/perl -wmy $text = '(outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)';while($text =~ /(\(([^()]|(?R))*\))/g) {
print("----------\n$1\n");}
将打印:----------(外
(中央
(内)
(内)
中央)
欧尔)----------(外
(内)
欧尔)----------(外
欧尔)
或者,PHP等价物:$text = '(outer
(center
(inner)
(inner)
center)
ouer)
(outer
(inner)
ouer)
(outer
ouer)';preg_match_all('/(\(([^()]|(?R))*\))/', $text, $matches);print_r($matches);
产生:排列(
[0] =>数组
(
[0] =>(外
(中央
(内)
(内)
中央)
欧尔)
[1] =>(外部
(内)
欧尔)
[2] =>(外部
欧尔)
)...
一个解释:(#start group 1
\(#match a literal'(''
(#组2
[^()]#除''和'''以外的任何字符
| # 要么
(?R)#递归匹配entir模式
)*#end group 2并重复零次或多次
\)#match a literal')')#end group 1
编辑
注意@ Goozak的评论:一个更好的模式可能是\(((?>[^()]+)|(?R))*\)(来自PHP:递归模式)。对于我的数据,Bart的模式在遇到没有嵌套的(长字符串)时崩溃了PHP。这个模式经历了我的所有数据没有问题。