如何编写正则表达式递归捕获大括号间内容并单独提取每个结构块
大括号独立结构块正则匹配方案
你之前使用的(.*{.*}$)会一次性匹配全部内容,核心问题是默认贪婪匹配逻辑会尽可能匹配最长字符串,且没有做匹配边界、大括号层级的限定,根据结构是否存在嵌套,可选择对应方案实现分块提取:
平级无嵌套结构(匹配你给出的示例场景)
这种场景不需要递归逻辑,直接用边界限定的正则即可,开启全局匹配(g修饰符)就能逐个拿到所有独立块:
\w+\s*\{[^{}]*\}
各部分匹配逻辑:
\w+:匹配结构名称,对应示例中的NewRequest、NewResponse\s*:兼容结构名和左大括号之间的空格、换行符\{:匹配块起始的左大括号[^{}]*:匹配大括号内部所有不含大括号的内容(平级结构内部不会出现新的大括号,不会出现跨块匹配)\}:匹配块闭合的右大括号
带嵌套大括号的结构(需要递归匹配)
如果结构内部存在多层嵌套大括号,需要使用支持递归特性的正则引擎(PCRE系,覆盖PHP、Python第三方regex库、Rust正则等场景),对应正则写法:
\w+\s*(\{(?:[^{}]|(?1))*\})
各部分匹配逻辑:
- 外层
\w+\s*逻辑和上述平级场景一致,用来匹配结构名和前置空白 - 捕获组
(\{(?:[^{}]|(?1))*\})负责匹配完整大括号块:- 首先匹配起始左大括号
{ - 中间内容分两种情况匹配:要么是普通非大括号字符
[^{}],要么递归执行当前捕获组的匹配规则(?1)——也就是遇到内部新的左大括号时,自动按大括号配对规则计数,直到所有嵌套层级的大括号全部闭合 - 最后匹配对应层级的闭合右大括号
}
开启全局匹配后,就能准确提取每一个外层独立结构块,不会被内部嵌套的大括号截断。
- 首先匹配起始左大括号
旧写法的问题说明
.*默认贪婪匹配,会从第一个结构的开头一直匹配到最后一个结构的末尾,不会在单个块结束位置停止- 没有限定大括号的匹配范围,只要匹配到行尾的右大括号就会把前面所有内容纳入结果,自然无法实现分块。
注意:JavaScript原生正则不支持递归匹配语法,如果是JS环境处理嵌套大括号场景,不建议硬写正则,用栈计数遍历字符串的方案实现,稳定性远高于正则。
内容的提问来源于stack exchange,提问作者Dansekongen
相关产品推荐
相关产品推荐

