JavaScript如何使用正则仅按一级方括号拆分含嵌套括号的字符串
解决方案
你之前使用的/(\[.+?\])/是惰性匹配规则,只会匹配到第一个]就停止,不会识别嵌套的方括号结构,因此会错误拆分内部嵌套的括号内容。
实现方案
由于JavaScript正则没有原生的平衡组语法,要兼容任意深度的嵌套方括号场景,最稳妥的方式是通过遍历计数实现一级括号拆分,性能和兼容性都更优:
const str = 'key[type=order][0].item[id={getVal(obj[type=item][0].id)}]'; // 第一步拆分一级点号,原有逻辑可直接复用 const arr = str.split(/\.(?![^[]*])/).filter(Boolean); // 一级方括号拆分函数 function splitTopBrackets(str) { const result = []; let currentFragment = ''; let bracketDepth = 0; for (const char of str) { if (char === '[') { // 遇到一级左括号,先保存括号前的标识符片段 if (bracketDepth === 0 && currentFragment) { result.push(currentFragment); currentFragment = ''; } bracketDepth++; currentFragment += char; } else if (char === ']') { currentFragment += char; bracketDepth--; // 一级括号闭合,保存完整的括号片段 if (bracketDepth === 0) { result.push(currentFragment); currentFragment = ''; } } else { currentFragment += char; } } // 兼容处理末尾剩余的非括号字符 if (currentFragment) result.push(currentFragment); return result; } // 得到最终结果 const finalResult = arr.map(item => splitTopBrackets(item));
运行后输出的结果完全符合需求:
[ ['key', '[type=order]', '[0]'], ['item', '[id={getVal(obj[type=item][0].id)}]'] ]
如果仅在高版本JS环境(Chrome 113+、Node.js 20+)使用,也可以用ES2025支持的递归正则实现,写法更简洁:
const finalResult = arr.map(item => item.split(/(\[(?:[^[\]]|(?R))*\])/g).filter(Boolean))
内容的提问来源于stack exchange,提问作者midstack
相关产品推荐
相关产品推荐

