/(?=^.{8,}$)(?=.*[_!@#$%^&*-])(?=.*\d)(?=.*\W+)(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/
我正在尝试使用密码验证的正则表达式,使密码必须至少为8个字符,并包含一个大写,一个小写,一个数字和一个特殊字符。它工作正常,但它不会将下划线(_)识别为特殊字符。即,Pa $$ w0rd匹配,但Pass_w0rd不匹配。想法?
答案 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,}$/
您的原始正则表达式中几乎没有错误,例如:
[.\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
是否有点过分。选择一个,你可能会更快乐。我还建议将整个部分拆分为几个单独的测试,以提高可维护性。