JavaScript数字检测函数问题:重叠拼写数字识别异常
解决方案:用正则正向预查处理重叠数字词,结合位置排序解决指针逻辑问题
原代码的核心问题在于手动维护指针i的逻辑过于僵硬,硬编码的i--仅能处理共享单个字符的重叠场景(如twone),但无法应对连续不重叠的数字词(如twothree),导致后续数字词被遗漏。
解决思路
放弃手动逐个字符匹配的方式,改用以下步骤:
- 正则正向预查捕获所有重叠/非重叠数字词:利用
(?=...)正向预查特性,无需消耗字符即可捕获所有可能的数字词(包括重叠的情况,如twone中的two和one)。 - 收集所有数字的位置信息:同时提取阿拉伯数字和英文数字词的出现位置,确保后续能按输入顺序排序。
- 按位置排序生成结果字符串:将所有数字按出现顺序排列,再提取首尾字符组成最终结果。
修正后的代码
function detectNumbers(input) { const wordToNumbers = new Map([ ['zero', '0'], ['one', '1'], ['two', '2'], ['three', '3'], ['four', '4'], ['five', '5'], ['six', '6'], ['seven', '7'], ['eight', '8'], ['nine', '9'] ]); const numberEntries = []; // 捕获所有英文数字词(含重叠) const wordRegex = /(?=(zero|one|two|three|four|five|six|seven|eight|nine))/g; let match; while ((match = wordRegex.exec(input)) !== null) { numberEntries.push({ pos: match.index, num: wordToNumbers.get(match[1]) }); } // 捕获所有阿拉伯数字 const digitRegex = /\d/g; while ((match = digitRegex.exec(input)) !== null) { numberEntries.push({ pos: match.index, num: match[0] }); } // 按出现位置排序 numberEntries.sort((a, b) => a.pos - b.pos); // 生成结果字符串 const outStr = numberEntries.map(entry => entry.num).join(''); // 处理空输入情况(避免原代码的索引错误) if (outStr.length === 0) { return 0; } const result = outStr[0] + outStr[outStr.length - 1]; return parseFloat(result); } // 测试用例 console.log(detectNumbers('eightwothree')); // 输出 83 console.log(detectNumbers('twone')); // 输出 21 console.log(detectNumbers('twothree')); // 输出 23 console.log(detectNumbers('a1bthree')); // 输出 13
效果说明
- 对于
eightwothree:正确识别eight(8)、two(2)、three(3),生成823,最终返回83。 - 对于
twone:同时捕获two(2)和one(1),生成21,最终返回21。 - 对于
twothree:正确识别two(2)和three(3),生成23,最终返回23。 - 混合阿拉伯数字和英文数字词的场景也能按顺序正确提取。
内容的提问来源于stack exchange,提问作者Negar Nasiri
相关产品推荐
相关产品推荐

