当我的密码即将被更改时,我被赋予了验证密码的任务.密码需要:
这是我正在使用的正则表达式:
^.*(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=-_]).*$
Run Code Online (Sandbox Code Playgroud)
因为我不是正则表达式的专家,所以我一直在关注Code Project的教程(我发现它非常有帮助).虽然我花了超过30分钟阅读教程,但我仍然无法理解问题所在.
问题:
正则表达式寻找除特殊字符之外的所有内容.我没有看到问题.
在我寻找答案时,我遇到了derekslager.com博客,该博客有一个非常好的页面用于测试表达式.
你的正则表达式有一个微妙的缺陷:
[@#$%&+=-_]
^
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.com和regexhero.net上的正则表达式
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |