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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:03