正则表达式不允许某些特殊字符。

9
我有以下正则表达式,它不允许某些特殊字符:
if (testString.match(/[`~,.<>;':"\/\[\]\|{}()-=_+]/)){    
    alert("password not valid");
}
else
{
    alert("password valid");
}

这是有效的。如果密码不包含括号中的任何特殊字符(~,.<>;':"\/\[\]\|{}()-=_+),则此正则表达式将接受该密码。
我的问题是它不允许我输入数字,这很奇怪。有什么我漏掉的吗?提前感谢!
这里是一个示例: jsFiddle

4
你可以参考@m.buettner的回答修正你的正则表达式,但你仍在错误地使用它:应该使用白名单方法,明确指定有效字符! - Daren Thomas
@DarenThomas 完全同意 - Martin Ender
我还有一个if条件来检查有效字符,但我在服务器端使用它。现在我正在创建一个客户端函数,将检查是否存在一些不允许的字符,并将密码指示器信号更改为弱。 - Gerald
另外,在客户端,我有一个js函数来检查是否存在有效的特殊字符,并将密码指示器信号更改为强。 - Gerald
1个回答

11

您在这里使用了一个字符范围:)-=,它包括介于)=之间的所有ASCII字符(包括数字)。请将-移动到类的末尾或对其进行转义:

/[`~,.<>;':"\/\[\]\|{}()=_+-]/

此外,您不需要转义所有这些字符:

/[`~,.<>;':"/[\]|{}()=_+-]/

请注意,在您的情况下,使用test而不是match可能已足够:

if (/[`~,.<>;':"/[\]|{}()=_+-]/.test(testString))){
    ...

test 返回一个布尔值(这就是你所需要的),而match 返回一个包含所有捕获组的数组(你无论如何都要丢弃它们)。

请注意,正如 Daren Thomas 在评论中指出的那样,你应该决定想要“允许”的字符,因为当前方法并不能处理各种奇怪的Unicode字符,同时还抱怨了一些相当标准的字符,比如_。要创建一个白名单,你可以简单地反转字符类和条件:

if (!/[^a-zA-Z0-9]/.test(testString)) {
   ...

同时包含您希望允许的所有字符。


谢谢你!还有关于 test 的事情。 - Gerald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接