正则表达式不会将下划线视为特殊字符

时间:2012-06-04 21:45:09

标签: regex

/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*\W+)(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/

我正在尝试使用密码验证的正则表达式,使密码必须至少为8个字符,并包含一个大写,一个小写,一个数字和一个特殊字符。它工作正常,但它不会将下划线(_)识别为特殊字符。即,Pa $$ w0rd匹配,但Pass_w0rd不匹配。想法?

4 个答案:

答案 0 :(得分:3)

这部分正则表达式似乎在寻找特殊字符:

(?=.*[!@#$%^&*-])

请注意,字符类不包含下划线,请尝试将其更改为以下内容:

(?=.*[_!@#$%^&*-])

您还需要修改或删除正则表达式的这一部分:

(?=.*\W+)

\W相当于[^a-zA-Z0-9_],因此如果下划线是您唯一的特殊字符,则此部分正则表达式将导致其失败。相反,将其更改为以下(或删除它,因为您之前已经检查过特殊字符,所以它是多余的):

(?=.*[^\w_])

完整的正则表达式:

/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*[^\w_])(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/

答案 1 :(得分:1)

一个适合你的简单正则表达式是:

/(?=.*[_!@#$%^&*-])(?=.*\d)(?!.*[.\n])(?=.*[a-z])(?=.*[A-Z])^.{8,}$/

您的原始正则表达式中几乎没有错误,例如:

  • 您不需要使用前瞻来确保输入中有8个字符
  • 否定前瞻[.\n]缺少.*
  • (?=.*\W+)是多余的,可能没有任何用途

答案 2 :(得分:1)

这个也适用。它通过排除字母数字字符和空格来定义一个特殊字符,因此它包含下划线:

(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[\d])(?=.*?[^\sa-zA-Z0-9]).{8,}

答案 3 :(得分:0)

问题在于,根据定义,唯一可能满足\W的东西不是[a-zA-Z0-9_]。下划线与\W特别不匹配,在Pass_w0rd中,其他任何内容都不匹配。

我怀疑拥有特定的特殊字符列表 \W是否有点过分。选择一个,你可能会更快乐。我还建议将整个部分拆分为几个单独的测试,以提高可维护性。