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

如何编写正则表达式递归捕获大括号间内容并单独提取每个结构块

大括号独立结构块正则匹配方案

你之前使用的(.*{.*}$)会一次性匹配全部内容,核心问题是默认贪婪匹配逻辑会尽可能匹配最长字符串,且没有做匹配边界、大括号层级的限定,根据结构是否存在嵌套,可选择对应方案实现分块提取:

平级无嵌套结构(匹配你给出的示例场景)

这种场景不需要递归逻辑,直接用边界限定的正则即可,开启全局匹配(g修饰符)就能逐个拿到所有独立块:

\w+\s*\{[^{}]*\}

各部分匹配逻辑:

  • \w+:匹配结构名称,对应示例中的NewRequest、NewResponse
  • \s*:兼容结构名和左大括号之间的空格、换行符
  • \{:匹配块起始的左大括号
  • [^{}]*:匹配大括号内部所有不含大括号的内容(平级结构内部不会出现新的大括号,不会出现跨块匹配)
  • \}:匹配块闭合的右大括号

带嵌套大括号的结构(需要递归匹配)

如果结构内部存在多层嵌套大括号,需要使用支持递归特性的正则引擎(PCRE系,覆盖PHP、Python第三方regex库、Rust正则等场景),对应正则写法:

\w+\s*(\{(?:[^{}]|(?1))*\})

各部分匹配逻辑:

  • 外层\w+\s*逻辑和上述平级场景一致,用来匹配结构名和前置空白
  • 捕获组(\{(?:[^{}]|(?1))*\})负责匹配完整大括号块:
    • 首先匹配起始左大括号{
    • 中间内容分两种情况匹配:要么是普通非大括号字符[^{}],要么递归执行当前捕获组的匹配规则(?1)——也就是遇到内部新的左大括号时,自动按大括号配对规则计数,直到所有嵌套层级的大括号全部闭合
    • 最后匹配对应层级的闭合右大括号}
      开启全局匹配后,就能准确提取每一个外层独立结构块,不会被内部嵌套的大括号截断。

旧写法的问题说明

  • .*默认贪婪匹配,会从第一个结构的开头一直匹配到最后一个结构的末尾,不会在单个块结束位置停止
  • 没有限定大括号的匹配范围,只要匹配到行尾的右大括号就会把前面所有内容纳入结果,自然无法实现分块。

注意:JavaScript原生正则不支持递归匹配语法,如果是JS环境处理嵌套大括号场景,不建议硬写正则,用栈计数遍历字符串的方案实现,稳定性远高于正则。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:27:22