- 正规表达式 - 匹配平衡括号的正则表达式

需要一个正则表达式来选择两个外括号之间的所有文本。

例如:some text(text here(possible text)text(possible text(more text)))end text

结果:(text here(possible text)text(possible text(more text)))

时间:

正规表达式是错误的工具,因为你正在处理嵌套结构,换句话说,递归。

但是有一个简单的算法可以做到这个,这个答案

.NET正规表达式使用平衡组


((?>((?<c>)|[^()]+|)(?<-c>))*(?(c)(?!)))



其中c用作深度计数器。

Regexstorm.com的演示!

  • 堆栈溢出:使用正规表达式平衡匹配括号
  • Wes =puzzzling Blog:将平衡结构与.NET正规表达式匹配
  • Greg Reinacker的web log:正规表达式中的嵌套结构

PCRE使用递归模式


((?:[^)(]+|(?R))*+)



regex101的演示;或没有altern:


((?:[^)(]*(?R)?)*+)



regex101的演示;或展开用于性能:


([^)(]*+(?:(?R)[^)(]*)*+)



regex101的演示;在表示(?0)(?R)处粘贴模式。

Perl,PHP,NotePad++,r:perl =TRUE,python:正规表达式软件包(?V1)用于Perl行为。

ruby使用子表达式调用

With Ruby 2.0 g<0>可用于调用完全模式。


((?>[^)(]+|g<0>)*)



Rubular的演示;仅支持Ruby 1.9 捕获组递归


(((?>[^)(]+|g<1>)*))



Rubular的演示(原子分组自ruby 1.9.3起)

JavaScript API::XRegExp.matchRecursive


XRegExp.matchRecursive(str, '(', ')', 'g');



JS,Java和其他正规表达式风格,没有递归,最多2级嵌套:


((?:[^)(]+|((?:[^)(]+|([^)(]*))*))*)



regex101的演示,深入需要添加嵌套到模式,


  • rexegg.com网站-递归正则表达式
  • 正则表达式递归

你可以使用正规表达式递归

 
(([^()]|(?R))*)



 
[^(]*((.*))[^)]*



 
(?<=().*(?=))



这个正规表达式只返回字符串中第一个左括号和最后一个右括号之间的文本。

这是最终的正规表达式:


(


(?<arguments> 


( 


 ([^()']*) | 


 (([^()']*)) |


 '(.*?)'



)*


)


)



例如:


input: ( arg1, arg2, arg3, (arg4), '(pip' )



output: arg1, arg2, arg3, (arg4), '(pip'



注意,'(pip'被正确管理为string,试过调节器:http://sourceforge.net/projects/regulator/)

我编写了一个小的JavaScript库,名为balanced以帮助完成这个任务。你可以做到这个


balanced.matches({


 source: source,


 open: '(',


 close: ')'


});



你甚至可以替换:


balanced.replacements({


 source: source,


 open: '(',


 close: ')',


 replace: function (source, head, tail) {


 return head + source + tail;


 }


});



下面是一个更复杂和交互的例子jsfiddle

使用ruby (版本1.9.3或更高版本)的正则表达式:


/(?<match>((?:g<match>|[^()]++)*))/



...