如何在JavaScript中判断字符串仅包含字母、数字和下划线?
问题原因
- 类型比较错误:直接用字符串类型的单个字符和正则对象做相等判断,两种不同类型的对象直接等值比较永远返回false,因此你的条件判断会始终触发
return false。 - 正则使用逻辑错误:首先
\w元字符本身就包含大小写字母、数字和下划线,额外加|_属于冗余;其次你写的正则/^(\w|_)+$/是匹配整个符合规则的字符串的规则,完全不适合用来匹配单个字符;另外判断字符串是否匹配正则不能用等值比较,应该用正则的.test()方法。 - 额外逻辑问题:你这段代码没有返回true的分支,就算全部校验通过也不会返回正确结果,而且如果这段代码不是写在函数内部的话,直接用
return会抛出语法错误。
正确实现方案
方案1:直接用正则全量匹配(推荐,性能更好)
不需要循环,一行代码就能实现,直接用正则匹配整个字符串是否符合要求:
const isValidStr = (str) => /^\w*$/.test(str) // 测试用例 console.log(isValidStr('test')) // true console.log(isValidStr('test123_')) // true console.log(isValidStr('test 123')) // false(包含空格) console.log(isValidStr('test@abc')) // false(包含特殊字符@)
正则/^\w*$/说明:^匹配字符串开头,\w*匹配0个或多个字母/数字/下划线,$匹配字符串结尾,确保整个字符串所有字符都符合规则。如果要求字符串不能为空,把*改成+即可。
方案2:循环实现版本
如果有需求必须用循环判断,可以修改为以下写法:
const isValidStr = (str) => { const singleCharReg = /\w/ // 匹配单个符合要求的字符 for (let i = 0; i < str.length; i++) { if (!singleCharReg.test(str.charAt(i))) { return false } } return true }
内容的提问来源于stack exchange,提问作者Roger González Hermosa
相关产品推荐
相关产品推荐

