You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式匹配平衡括号外的全部文本?

用正则匹配平衡括号外的所有文本

当然可以实现!只要你的正则引擎支持递归(比如PCRE、JavaScript ES2018+、Python的regex模块等),就能写出匹配括号外文本的正则表达式。

核心思路

我们的目标是跳过所有平衡的括号对(包括嵌套的),同时捕获不在括号内的文本。具体来说,正则会交替执行两个操作:

  • 匹配并跳过完整的平衡括号结构(从最外层的(到对应的),包含内部嵌套)
  • 捕获连续的非括号字符(这些就是我们要的括号外文本)

正则表达式

以下是适用于支持递归的引擎的模式:

(?:(?<balanced>\((?:[^()]|(?&balanced))*\))|([^()]+))+

模式拆解

  • (?<balanced>\((?:[^()]|(?&balanced))*\)): 命名递归组,匹配任意平衡括号对。(?&balanced)会递归调用这个组本身,从而处理嵌套括号。
  • ([^()]+): 捕获组,匹配连续的非括号字符(即括号外的文本)。
  • (?: ... | ... )+: 非捕获组,重复执行“跳过括号”或“捕获文本”的逻辑,直到遍历完整个字符串。

示例代码(JavaScript)

const input = "Quiz: (Find all text that) outside of the outmost balanced parenthesis. (Be careful since) there might (be ((nested)) ones!) :) (async () => await console.log(1))()) You can do it! ()()(())():((1)((((((2)((3)))))))It would be even better the text is consecutive (and no more unneccessary (capturing groups!))() 2 * (1 + 3) = 8(eight) :( Did you do it ? (no) yes";
const regex = /(?:(?<balanced>\((?:[^()]|(?&balanced))*\))|([^()]+))/g;
const result = [];

let match;
while ((match = regex.exec(input)) !== null) {
  // 收集非空的捕获结果
  if (match[2]) {
    result.push(match[2]);
  }
}

// 输出格式化后的结果
console.log(result.join('\n'));

注意事项

  • 该方案仅支持能处理递归的正则引擎,基础引擎(如旧版JavaScript、Python标准库的re模块)无法处理嵌套括号,因此无法实现此需求。
  • 如果输入存在未平衡的括号(比如多余的(或)),正则可能会出现意外匹配(比如将后续所有内容视为括号外文本,或提前终止)。

内容的提问来源于stack exchange,提问作者hiroshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:25:25