0

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

  • 长度至少为 8 个字符
  • 至少有一个大写字母
  • 至少有一个小写字母
  • 至少有一位数字
  • 至少有一个特殊字符

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

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

由于我不是正则表达式方面的专家,因此我一直在关注Code Project 的教程(我发现这很有帮助)。虽然我花了 30 多分钟阅读教程,但我仍然无法理解问题所在。

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

当我在寻找答案时,我偶然发现了derekslager.com 博客,它有一个非常好的测试表达式的页面。

4

2 回答 2

5

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

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

字符类中的破折号指定一个字符范围,这意味着如果您的密码中有以下任何字符,您的字符类将注册一个“正”匹配:

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

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

[@#$%&+=_-]

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

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

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

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

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

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

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

如果您想允许您的用户在密码中包含回车,请务必使用Singleline 标志

regexplanet.comregexhero.net上查看正则表达式

于 2013-07-22T14:44:06.907 回答
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 [[\^$.|?*+()]

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

于 2013-07-22T14:42:07.363 回答