我需要一个正则表达式来选择两个外括号之间的所有文本。
示例:一些文本(此处的文本(可能文本)文本(可能文本(更多文本)))结束文本
结果:(此处文本(可能文本)文本(可能文本(更多文本))
我想添加此答案以供快速参考。随时更新。
.NET正则表达式使用平衡组。
\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\)
其中c
用作深度计数器。
Regexstorm演示。通用域名格式
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的正向引用是一个有趣的想法。
引用-这个正则表达式是什么意思?
正则表达式对于这项工作来说是错误的工具,因为您处理的是嵌套结构,即递归。
但是有一个简单的算法可以做到这一点,我在前面一个问题的回答中更详细地描述了这一点。要点是编写扫描字符串的代码,保留一个开括号的计数器,这些开括号还没有被闭括号匹配。当计数器返回到零时,您就知道您已经到达了最后一个括号。
您可以使用正则表达式递归:
\(([^()]|(?R))*\)