正则表达式匹配外部括号
我需要一个正则表达式来选择两个外括号之间的所有文本。
例如: some text(text here(possible text)text(possible text(more text)))end text
结果:( (text here(possible text)text(possible text(more text)))
我一直在尝试几个小时,请注意,我的正则表达知识不是我想要的:-)所以,任何帮助都会受到感谢。
正则表达式是工作的错误工具,因为您正在处理嵌套结构,即递归。
但是有一个简单的算法来做到这一点,我在前面的问题的答案中描述了这一点。
你可以使用正则表达式递归:
(([^()]|(?R))*)
我想为快速参考添加此答案。 随时更新。
使用平衡组的.NET Regex 。
((?>((?<c>)|[^()]+|)(?<-c>))*(?(c)(?!)))
其中c
用作深度计数器。
在Regexstorm.com上演示
PCRE使用递归模式。
((?>[^)(]+|(?R))*)
演示在regex101; 或者没有改变:
((?>[^)(]*(?R)?)*)
演示在regex101。 该图案粘贴在代表(?0)
(?R)
(?0)
。
Perl,PHP,Notepad ++,R:perl = TRUE,Python:用于Perl行为的带有(?V1)
Regex包。
Ruby使用子表达式调用。
使用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。 更深的嵌套需要添加到模式。
在不平衡圆括号上失败的速度会降低+
量词。
Java :使用@jaytea的前向引用的一个有趣想法。
参考 - 这个正则表达式是什么意思?