JavaScript提取指定括号内容时循环异常,期望得到'4-x'字符串
问题说明
需求是从字符串变量equation中提取指定左括号(索引已存在opening数组中)对应的括号内内容,存入变量a,初始代码如下:
let equation = '2(x(4-5x)(4-x))+10' let opening = [9,3,1,0] let a = ''
预期输出:a = '4-x'
原有方案错误分析
- 方案1触发无限循环:循环初始值错取了
equation[opening[0]]也就是索引9位置的字符(,后续执行x++是对字符串值做自增,永远不可能满足x != ')'的终止条件,因此死循环。 - 方案2变量a为空:同样错误地将字符作为循环初始值,字符串和数值做大小比较时会被转换为
NaN,NaN < equation.length的判断结果永远为false,循环体从未执行,因此a始终为空字符串。
修正后代码
两个方案的核心问题都是混淆了遍历索引和索引对应的字符值,修正逻辑:从目标左括号的下一个索引位置开始遍历字符串,遇到第一个匹配的右括号时终止,拼接中间的所有字符即可。
let equation = '2(x(4-5x)(4-x))+10' let opening = [9,3,1,0] let a = '' const start = opening[0] + 1 // 左括号的下一位才是内容起始位置 for (let i = start; i < equation.length; i++) { if (equation[i] === ')') break a += equation[i] }
执行后a的值即为'4-x',符合预期。
如果后续需要提取的括号内部存在嵌套括号,可以新增一个括号计数器,遇到左括号计数+1,遇到右括号计数-1,当计数器归0时才终止遍历,就能匹配到正确的闭合右括号。
内容的提问来源于stack exchange,提问作者Kalvin
相关产品推荐
相关产品推荐

