没有特殊字符的REGEX密码验证

时间:2011-06-02 10:47:30

标签: regex

我正在使用此正则表达式来验证我的密码。 我的密码 -

  • 只能是字母数字,
  • 至少包含8个字符
  • 至少2个数字
  • 且至少有2个字母。

我的正则表达式是

^.*(?=.{8,})(?=.*\d*\d)(?=.*[a-zA-Z]*[a-zA-Z])(?!.*\W).*$

但不幸的是,如果我尝试在开头放置特殊字符,它仍然匹配。 例如@password12!password12

3 个答案:

答案 0 :(得分:2)

因为您的模式以.*开头和结尾,所以它将匹配字符串开头或结尾处的任何内容,包括特殊字符。

您不应该使用单个正则表达式解决此问题,这会使代码难以阅读且难以修改。使用对该规则有意义的任何内容为每个规则编写一个函数,然后验证脚本变得清晰:

if is_alpha_only(password) && 
   len(password) > = 8 && 
   has_2_or_more_numbers(password) &&
   has_2_or_more_alpha(password) ...

说真的,把所有这些都塞进一个正则表达式的重点是什么?

为什么不允许特殊字符?没有理由这样做。

答案 1 :(得分:2)

您可以在不区分大小写的模式下使用以下正则表达式:

^(?=[a-z]*[0-9][a-z]*[0-9])^(?=[0-9]*[a-z][0-9]*[a-z])[a-z0-9]{8,}$

See it

答案 2 :(得分:1)

我有类似的情况,其中客户端需要4个字母,1个数字,以及8到20个字符。我已根据您的问题调整了我的解决方案:

^(?=(?:[a-zA-Z0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z0-9]*\d){2})[a-zA-Z0-9]{8,}$

我理解其他答案会阻止你走这条路线,但有时客户想要客户想要的东西,不管你的相反论点是什么。