9

我有以下不允许某些特殊字符的正则表达式:

if (testString.match(/[`~,.<>;':"\/\[\]\|{}()-=_+]/)){    
    alert("password not valid");
}
else
{
    alert("password valid");
}

这是有效的。如果括号内不包含任何特殊字符,此正则表达式将接受密码(~,.<>;':"\/\[\]\|{}()-=_+)

我的问题是它也不允许我输入奇怪的数字。

我在这里错过了什么?提前致谢!

这是一个示例:

jsFiddle

4

1 回答 1

11

你有一个字符范围:其中包括和)-=之间的所有 ASCII 字符(包括数字)。将 移动到类的末尾或将其转义:)=-

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

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

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

请注意,在您的情况下,使用test而不是match

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

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

请注意,正如 Daren Thomas 在评论中指出的那样,您应该决定要允许哪些字符。因为当前的方法没有处理各种奇怪的 Unicode 字符,同时抱怨一些相当标准的字符,例如_. 要创建白名单,您可以简单地反转字符类和条件:

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

并包括您想要允许的所有字符。

于 2013-08-23T08:17:24.683 回答