正则表达式密码策略不起作用

时间:2013-07-22 14:21:56

标签: .net regex

我的任务是在密码即将更改时验证密码。 密码需要:

  • 至少8个字符
  • 至少有一个大写字母
  • 至少有一个小写字母
  • 至少有一位数字
  • 至少有一个特殊的charachter

这是我正在使用的正则表达式:

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

由于我不是正则表达式的专家,我一直关注tutorial on Code Project(我发现它非常有帮助)。虽然我花了超过30分钟阅读教程,但我仍然无法理解问题所在。

问题:
正则表达式寻找除特殊字符之外的所有内容。我没有看到问题。

在我寻找答案时,我遇到了derekslager.com blog,它有一个非常好的页面来测试表达式。

2 个答案:

答案 0 :(得分:5)

你的正则表达式有一个微妙的缺陷:

[@#$%&+=-_]
        ^

字符类中的破折号指定character range,这意味着如果您的密码中包含以下任何字符,您的字符类将会注​​册“肯定”匹配:

  

@,#,$,%,&,+,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M ,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_

如果您转置-_,则可以避免此问题:

[@#$%&+=_-]

位于角色类中第一个或最后一个位置的虚线失去了它们的特殊含义,被视为文字破折号。

此外,您在模式的开头和结尾不需要.*。您的零宽度断言(又名“前瞻”)已经包含.*,因此这是多余的,只会导致正则表达式在负匹配上变慢。如果您只使用正则表达式来测试输入,那么您可以从第一个字符开始,不需要捕获任何内容:

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

如果您想捕获密码,则可以使用:

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

只是为了咯咯笑,如果你想设置密码的最大界限,你可以从你的第一个前瞻中做到这一点:

^(?=.{8,30}$)

如果您希望允许用户在其密码中包含回车,请务必使用Singleline flag

regexplanet.comregexhero.net

上查看正在使用的正则表达式

答案 1 :(得分:0)

有人纠正我,如果我错了,但如果密码可以是你要求的任何组合,你可能需要一次验证一个,但如果模式总是相同,那么一行正则表达式应该做的伎俩,例如,如果它总是如此:

Qwe12;,.  
[Capital Letter(s)][lowercase letter(s)][number(s)][special character(s)]

然后,一行正则表达式相对容易提出验证它,但如果它可以是您的要求的任何组合,例如

weQ,.12  

12we,.Q

然后可以更容易一次验证一个:

First check for caps [A-Z]
Then lowercase [a-z]
Then numbers [0-9]
Then special characters [[\^$.|?*+()]

因此,如果其中任何一个失败密码无效,希望这会有所帮助。