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

Thu*_*3eR 0 .net regex

当我的密码即将被更改时,我被赋予了验证密码的任务.密码需要:

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

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

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

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

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

在我寻找答案时,我遇到了derekslager.com博客,该博客有一个非常好的页面用于测试表达式.

JDB*_*JDB 5

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

[@#$%&+=-_]
        ^
Run Code Online (Sandbox Code Playgroud)

字符类中的破折号指定字符范围,这意味着如果密码中包含以下任何字符,则您的字符类将注册"肯定"匹配:

@,#,$,%,&,+,=,>,?,@,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,[,\,],^,_

如果你转置了-_,你可以避免这个问题:

[@#$%&+=_-]
Run Code Online (Sandbox Code Playgroud)

位于角色类中第一个或最后一个位置的破折号会失去其特殊含义,并被视为文字破折号.

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

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

如果你想捕获密码,那么你可以使用:

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

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

^(?=.{8,30}$)
Run Code Online (Sandbox Code Playgroud)

如果要允许用户在其密码中包含回车符,请务必使用Singleline标志.

请参阅regexplanet.comregexhero.net上的正则表达式