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

I'm trying to make a regex for password validation such that the password must be at least 8 chars and include one uppercase, one lowercase, one number, and one special char. It works fine except it won't recognize the underscore (_) as a special character. I.e., Pa$$w0rd matches, but Pass_w0rd doesn't. Thoughts?

4

4 回答 4

3

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

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

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

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

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

(?=.*\W+)

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

(?=.*[^\w_])

完整的正则表达式:

/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*[^\w_])(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/
于 2012-06-04T21:47:49.617 回答
2

这个在这里也有效。它通过排除字母数字字符和空格来定义特殊字符,因此它包括下划线:

(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[\d])(?=.*?[^\sa-zA-Z0-9]).{8,}
于 2015-10-01T09:46:25.700 回答
1

\W问题是,根据定义,唯一可能满足 的东西是 以外的东西[a-zA-Z0-9_]。下划线与 , 不匹配\W,在 中Pass_w0rd,也没有其他匹配项。

我怀疑同时拥有您的特殊字符的特定列表和\W矫枉过正。选择一个,你可能会更快乐。我还建议将整个事情分成几个单独的测试,以获得更好的可维护性。

于 2012-06-04T21:50:57.823 回答
1

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

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

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

  • 您不需要使用前瞻来确保输入中有 8 个字符
  • [.\n]缺少负前瞻.*
  • (?=.*\W+)是多余的,可能没有任何目的
于 2012-06-04T21:52:39.950 回答