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

如何实现仅提取外层尖括号节点的算法?

提取嵌套尖括号的最外层节点解决方案

需求说明

输入字符串:

'<apple, <pear>>, <orange, <apple>, <cherry>, banana>, <banana, <pear>, <orange>>'

要求提取所有最外层尖括号包裹的节点,每个节点可包含嵌套的尖括号内容,期望输出:

['<apple, <pear>>', '<orange, <apple>, <cherry>, banana>', '<banana, <pear>, <orange>>']

尝试过的无效方法

  • 正则分割法:使用/([^,<]*(?:<[^>]*>[^,<]*)*),?/g进行分割,无法正确识别嵌套结构,分割结果不符合预期。
  • 节点遍历法:通过match(/<[^<>]+>/g)提取所有非嵌套节点,再尝试拼接,但该正则会把嵌套的子节点单独提取,后续拼接逻辑也无法正确识别父节点边界,结果错误。

正确实现方法

采用括号计数法遍历字符串,通过维护尖括号的计数来定位最外层节点的边界:

function extractTopLevelNodes(input) {
  const result = [];
  let startIndex = -1;
  let bracketCount = 0;

  for (let i = 0; i < input.length; i++) {
    const char = input[i];
    if (char === '<') {
      bracketCount++;
      // 标记最外层节点的起始位置
      if (bracketCount === 1) {
        startIndex = i;
      }
    } else if (char === '>') {
      bracketCount--;
      // 当计数回到0时,说明找到完整的最外层节点
      if (bracketCount === 0 && startIndex !== -1) {
        result.push(input.slice(startIndex, i + 1));
        startIndex = -1;
      }
    }
  }

  return result;
}

// 测试示例
const input = '<apple, <pear>>, <orange, <apple>, <cherry>, banana>, <banana, <pear>, <orange>>';
console.log(extractTopLevelNodes(input));
// 输出:["<apple, <pear>>", "<orange, <apple>, <cherry>, banana>", "<banana, <pear>, <orange>>"]

方法原理

  • 遍历字符串时,遇到<就增加计数器,遇到>就减少计数器。
  • 当计数器从1变为0时,意味着当前位置是最外层节点的结束边界,此时截取从最外层起始位置到当前位置的子串,就是一个完整的最外层节点。
  • 嵌套的尖括号会让计数器先增后减,但不会触发最外层节点的结束判断,直到最外层的>出现,确保能正确识别包含嵌套内容的节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:43:10