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

例子: START_TEXT(这里的文本(可能的文本)文本(可能的文本(更多的文本))END_TXT ^ ^

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


当前回答

在处理嵌套模式和正则表达式是解决这类问题的正确工具时,我也陷入了这种情况。

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

其他回答

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

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

关节演示

答案取决于您是需要匹配括号的匹配集,还是只需要匹配输入文本中的第一个开始到最后一个结束的括号。

如果您需要匹配匹配的嵌套括号,那么您需要的不仅仅是正则表达式。-见@dehmann

如果只是先开后关,再见@扎克

决定你想要发生什么:

abc ( 123 ( foobar ) def ) xyz ) ghij

您需要决定在这种情况下您的代码需要匹配什么。

这个也有用

re.findall(r'\(.+\)', s)

我写了一个叫做balanced的JavaScript库来帮助完成这个任务。你可以这样做

balanced.matches({
    source: source,
    open: '(',
    close: ')'
});

你甚至可以做替换:

balanced.replacements({
    source: source,
    open: '(',
    close: ')',
    replace: function (source, head, tail) {
        return head + source + tail;
    }
});

下面是一个更复杂的交互式示例JSFiddle。

虽然很多答案都以某种形式提到了这一点,比如正则表达式不支持递归匹配等等,但主要原因在于计算理论的根源。

形式为{a^nb^n | n>=0}的语言是非正则的。Regex只能匹配构成常规语言集一部分的东西。

阅读更多@这里