正则表达式匹配外部括号

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

例如: 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上演示

  • 堆栈溢出 :使用RegEx来平衡匹配括号
  • Wes'迷惑博客 :使用.NET正则表达式匹配平衡构造
  • Greg Reinacker的博客 :正则表达式中的嵌套构造

  • 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的前向引用的一个有趣想法。


    参考 - 这个正则表达式是什么意思?

  • rexegg.com - 递归正则表达式
  • Regular-Expressions.info - 正则表达式递归
  • 链接地址: http://www.djcxy.com/p/76783.html

    上一篇: Regular Expression to match outer brackets

    下一篇: How to escape text for regular expression in Java