JavaScript如何解析嵌套方括号字符串为指定结构的结果数组
嵌套方括号分支字符串展开方案
问题复现
待处理的是嵌套方括号包裹的多分支结构,解析规则为:方括号内逗号分隔的内容为并列可选分支,需和括号外的前缀做全量拼接组合。
- 原始输入字符串:
var raw = "GMYTEOR[RHE5DO,SG[A5D[CN[I,Q],EM[I,Q],M],E5D[C[NY,OA],O,Q],M5DC[MY,NA],U5DQ,Y5DCOA]]"
- 预期输出结果数组:
const valid_results = [ 'GMYTEORRHE5DO', 'GMYTEORSGA5DCNI', 'GMYTEORSGA5DCNQ', 'GMYTEORSGA5DEMI', 'GMYTEORSGA5DEMQ', 'GMYTEORSGA5DM', 'GMYTEORSGE5DCNY', 'GMYTEORSGE5DCOA', 'GMYTEORSGE5DO', 'GMYTEORSGE5DQ', 'GMYTEORSGM5DCMY', 'GMYTEORSGM5DCNA', 'GMYTEORSGU5DQ', 'GMYTEORSGY5DCOA', ]
此前尝试的JSON.parse、简单按方括号/逗号分割方案不可行,核心原因是这类方案没有维护嵌套层级的上下文关系,无法区分不同层级逗号、括号的作用范围。
实现方案
用栈维护层级上下文是处理这类嵌套结构最通用的方法,单次遍历字符串即可完成解析,无冗余计算,支持任意深度嵌套。
核心逻辑
逐字符扫描字符串,按遇到的字符类型做对应处理:
- 普通字符:追加到当前正在拼接的分支片段末尾
`[`:进入新的嵌套层级,把当前层级的前缀集合压入栈保存,重置当前分支状态`,`:当前并列分支拼接完成,存入当前层级的分支列表,重置分支状态准备处理下一个并列项`]`:当前层级最后一个分支处理完成,弹出栈中保存的上层级上下文,把当前层所有分支结果作为上层级的拼接基础
可直接运行的代码
function parseBracketStr(str) { const stack = [] let currentPrefix = [''] let segmentBuffer = '' for (const c of str) { if (c === '[') { stack.push({ basePrefix: currentPrefix, branchList: [] }) currentPrefix = [...currentPrefix] segmentBuffer = '' } else if (c === ',') { const levelCtx = stack[stack.length - 1] currentPrefix.forEach(prefix => { levelCtx.branchList.push(prefix + segmentBuffer) }) segmentBuffer = '' currentPrefix = [...levelCtx.basePrefix] } else if (c === ']') { const levelCtx = stack.pop() currentPrefix.forEach(prefix => { levelCtx.branchList.push(prefix + segmentBuffer) }) currentPrefix = levelCtx.branchList segmentBuffer = '' } else { segmentBuffer += c } } return currentPrefix.map(p => p + segmentBuffer) } // 功能验证 const raw = "GMYTEOR[RHE5DO,SG[A5D[CN[I,Q],EM[I,Q],M],E5D[C[NY,OA],O,Q],M5DC[MY,NA],U5DQ,Y5DCOA]]" console.log(parseBracketStr(raw)) // 输出与预期valid_results完全一致
方案说明
- 实现时间复杂度为线性,字符串长度增加时解析效率不会明显下降
- 不依赖复杂正则,逻辑边界清晰,后续如果需要支持转义字符、自定义分隔符等需求,只需要在字符判断分支添加对应逻辑即可
- 不会出现简单分割方案常见的括号匹配错误、分支串接问题
内容的提问来源于stack exchange,提问作者Jridyard
相关产品推荐
相关产品推荐

