如何实现仅提取外层尖括号节点的算法?
提取嵌套尖括号的最外层节点解决方案
需求说明
输入字符串:
'<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
相关产品推荐
相关产品推荐

