JavaScript自定义Desen脚本正则与运算逻辑异常修复求助
问题诊断与修复方案
猜测验证
你的猜测完全正确,同时还存在其他语法、逻辑错误,具体错误如下:
具体错误原因
- 正则全局匹配逻辑错误:
check函数使用g标记的正则匹配整个输入字符串中所有对应字符加数字的组合,不是仅匹配当前位置后续的单个数字段,例如输入a13xna2x时调用check(code, 'a')会同时匹配a13和a2,返回累加值15,而非当前位置的13,导致数值累加完全不符合预期。 check函数表达式错误:eval拼接的表达式逻辑错误,处理b时生成的表达式为A - +C,返回值为所有匹配数字的累计负值,而调用处处理b时又使用了AC -= check(...),相当于AC = AC - (-数字和),变成了加对应数字,完全和预期的减法相反,这就是b97测试用例返回97而非-97的直接原因。- 语法错误:
b的判断分支结束多写了一个闭合大括号},导致n、g、x的判断逻辑完全不在遍历回调的作用域内,重置、转字符、输出逻辑全部失效,这是n重置无效的核心原因。 - 未跳过已处理的数字字符:处理完带数字的
a/b后没有跳过后续的数字字符,后续遍历到数字字符时会执行无匹配逻辑,存在运行隐患。 - 变量未声明:
AC、String_、ans均未加声明关键字,会隐式挂载为全局变量,存在变量污染风险。
修复方案
核心优化思路
抛弃全局匹配的check函数,遍历过程中直接读取当前位置后续的连续数字,处理完后跳过数字段避免重复处理。
修复后代码
const Desen = code => { let AC = 0; // 累计值 let String_ = ''; let ans = ""; const len = code.length; let i = 0; while (i < len) { const char = code[i]; if (char === 'a') { let numStr = ''; let j = i + 1; // 读取后续连续数字 while (j < len && /\d/.test(code[j])) { numStr += code[j]; j++; } if (numStr) { AC += Number(numStr); i = j; // 跳过已处理的数字 } else { AC += 1; i++; } } else if (char === 'b') { let numStr = ''; let j = i + 1; while (j < len && /\d/.test(code[j])) { numStr += code[j]; j++; } if (numStr) { AC -= Number(numStr); i = j; } else { AC -= 1; i++; } } else if (char === 'n') { AC = 0; i++; } else if (char === 'g') { String_ += String.fromCharCode(AC); i++; } else if (char === 'x') { ans += code[i-1] === 'g' ? (String_ + (String_ = '')) : AC; i++; } else { // 其他字符直接跳过 i++; } } return ans; }
测试用例验证
console.log(Desen("aaa13x")) // 输出15,符合预期 console.log(Desen("a13xna2x")) // 输出"132",符合预期 console.log(Desen("a97gxa2")) // 输出"a",符合预期 console.log(Desen("b97xa2")) // 输出-97,符合预期
内容的提问来源于stack exchange,提问作者Any3nymous user
相关产品推荐
相关产品推荐

