提问者:小点点

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


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

示例:一些文本(此处的文本(可能文本)文本(可能文本(更多文本)))结束文本

结果:(此处文本(可能文本)文本(可能文本(更多文本))


共3个答案

匿名用户

我想添加此答案以供快速参考。随时更新。

.NET正则表达式使用平衡组。

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

其中c用作深度计数器。

Regexstorm演示。通用域名格式

  • 堆栈溢出:使用RegEx平衡匹配括号
  • Wes'Puzzling Blog:将平衡结构与.NET正则表达式
  • Greg Reinacker的Weblog:正则表达式中的嵌套构造

PCRE使用递归模式。

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

regex101演示;或不加修改:

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

在regex101演示;或展开性能:

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

在regex101演示;模式粘贴在(?R)表示(?0).

Perl、PHP、Notepad、R:Perl=TRUE、Python:Regex包以及Perl行为的(?V1)

Ruby使用子表达式调用。

使用Ruby 2.0\g

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

Ruular演示;Ruby 1.9只支持捕获组递归:

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

演示在鲁邦

JavaScript

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

JS,Java和其他正则表达式口味没有递归多达2级嵌套:

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

在regex101演示。更深的嵌套需要添加到模式中。
要在不平衡括号中更快失败,请删除量词。

Java:使用@jaytea的正向引用是一个有趣的想法。

引用-这个正则表达式是什么意思?

  • 雷克塞格。com-递归正则表达式

匿名用户

正则表达式对于这项工作来说是错误的工具,因为您处理的是嵌套结构,即递归。

但是有一个简单的算法可以做到这一点,我在前面一个问题的回答中更详细地描述了这一点。要点是编写扫描字符串的代码,保留一个开括号的计数器,这些开括号还没有被闭括号匹配。当计数器返回到零时,您就知道您已经到达了最后一个括号。

匿名用户

您可以使用正则表达式递归:

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