我想验证字符串,该字符串不应包含除下划线(_)以外的任何特殊字符。 为此,我写了下面的代码,但我无法完成它。
var string = 'pro$12';
var result = /[a-zA-Z0-9_]*/.test(string);
在上面,给定的字符串无效但我得到的结果为true。 任何身体都可以告诉我这里做错了吗?
答案 0 :(得分:1)
它会返回true
,因为它可以匹配pro
。您可以使用match
函数查看实际匹配的字符串,如下所示。
console.log(string.match(/[a-zA-Z0-9_]*/));
# [ 'pro', index: 0, input: 'pro$12' ]
即使它与任何内容都不匹配,例如,您的输入为“12美元”,它也将返回true
。因为,*
匹配0个或更多字符。因此,它匹配$
中$12
之前的零个字符。 (谢谢@Jack for pointing out)
所以,你真正需要的是
console.log(/^[a-zA-Z0-9_]*$/.test(string));
# false
^
表示字符串的开头,$
表示字符串的结尾。基本上,你告诉RegEx引擎,匹配一个只包含字符类字符的字符串,从字符串的开头和结尾开始。
注意:您可以简单地使用[a-zA-Z0-9_]
,而不是使用显式字符类\w
。它与您提到的角色类完全相同。
从MDN Docs引用RegExp,
\ W
匹配基本拉丁字母表中的任何字母数字字符,包括下划线。相当于
[A-Za-z0-9_]
。例如,
}中的/\w/
匹配'a'
中的"apple,"
'5'
和"$5.28,"
中的'3'
"3D."
因此,您的RegEx可以像这样缩短
console.log(/^\w*$/.test(string));