【问题标题】:Regex not allowing certain special characters正则表达式不允许某些特殊字符
【发布时间】:2013-08-23 16:22:54
【问题描述】:

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

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

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

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

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

这是一个示例:

jsFiddle

【问题讨论】:

  • 虽然您可以使用@m.buettner 的答案来修复您的正则表达式,但您仍然做错了:使用 whilelist 方法,指定 valid 字符!
  • @DarenThomas 完全同意
  • 我也有 if 条件来仅检查有效字符,但我在服务器端使用它。我现在正在做的是创建一个客户端功能,该功能将检查是否存在一些不允许的字符,将密码指示器信号更改为弱。
  • 同样在客户端,我有一个js函数来检查是否存在有效的特殊字符,将密码指示器信号更改为强。

标签: javascript regex


【解决方案1】:

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

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

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

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

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

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

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

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

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

并包括您确实希望允许的所有字符。

【讨论】:

  • 谢谢你!也适用于test 的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2019-03-06
相关资源
最近更新 更多