使用正则表达式实现游戏游玩次数整数输入验证失效求助
游戏游玩次数输入验证问题排查与修复
问题分析
你的代码主要存在以下几个关键问题:
- 正则表达式使用错误:你试图用
!=让单个数字和正则对象比较,这完全不符合正则的使用逻辑。正则需要通过test()方法检测字符串是否匹配,而且你的拆分数组验证的思路完全没必要,直接验证用户输入的原始字符串即可。 - 输入转换逻辑漏洞:当用户输入非数字内容时,
Number(prompt())会返回NaN,将NaN转为字符串是"NaN",再拆成数组得到[NaN, NaN],此时循环验证根本起不到作用。 - 循环验证逻辑失效:就算触发了重新输入的逻辑,循环不会从头执行,会继续原来的索引,导致输入错误后依然可能跳过验证。
- 多余的正则全局标志:你的正则是用来验证整个输入是否为正整数,
g全局标志在这里毫无意义,反而可能引发后续匹配异常。
修复后的代码
let playCount = 0; // 验证非负整数的正则,若需排除0可改为 /^[1-9][0-9]*$/ const regxNum = /^[0-9]+$/; function askPlayCount() { const input = prompt("How many times you want to play: "); // 直接验证用户输入的原始字符串 if (regxNum.test(input)) { playCount = Number(input); } else { alert("Please enter valid input"); // 递归调用直到输入符合要求 askPlayCount(); } } askPlayCount(); // 验证通过后可在此处编写游戏逻辑 console.log(`You will play ${playCount} times`);
修复说明
- 直接针对用户输入的原始字符串做正则验证,避免了转换为Number时出现
NaN的问题。 - 使用
regxNum.test(input)正确判断输入是否符合正整数格式。 - 通过递归调用
askPlayCount(),确保用户输入正确后才继续执行后续逻辑,流程更可靠。 - 删除了不必要的数组转换和循环验证,简化了代码结构,提升可读性。
内容的提问来源于stack exchange,提问作者mr.Hritik
相关产品推荐
相关产品推荐

