.net 密码策略的正则表达式不起作用
我的任务是在密码即将更改时验证密码。 密码需要:.net 密码策略的正则表达式不起作用,.net,regex,.net,Regex,我的任务是在密码即将更改时验证密码。 密码需要: 长度至少为8个字符 至少有一个大写字母 至少有一个小写字母 至少有一个数字 至少有一个特殊字符 这是我正在使用的正则表达式: ^.*(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=-_]).*$ 因为我不是正则表达式方面的专家,所以我一直在遵循一个规则(我发现这非常有用)。虽然我花了30多分钟阅读教程,但我仍然无法理解问题所在 问题: 正则表达式查找除特殊字符以外的所有字符。
- 长度至少为8个字符
- 至少有一个大写字母
- 至少有一个小写字母
- 至少有一个数字
- 至少有一个特殊字符
^.*(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=-_]).*$
因为我不是正则表达式方面的专家,所以我一直在遵循一个规则(我发现这非常有用)。虽然我花了30多分钟阅读教程,但我仍然无法理解问题所在
问题:正则表达式查找除特殊字符以外的所有字符。我看不出有什么问题
在我搜索答案的过程中,我遇到了一个非常适合测试表达式的页面。如果我错了,有人会纠正我,但如果密码可以是您正在寻找的要求的任意组合,您可能需要一次验证一个,但如果模式始终相同,然后一行正则表达式就可以实现这一点,例如,如果它总是这样:
Qwe12;,.
[Capital Letter(s)][lowercase letter(s)][number(s)][special character(s)]
然后,一行正则表达式将相对容易地验证它,但如果它可以是您的需求的任意组合,例如
weQ,.12
或
然后,一次验证一个可能更容易,因此:
First check for caps [A-Z]
Then lowercase [a-z]
Then numbers [0-9]
Then special characters [[\^$.|?*+()]
因此,如果这些失败密码中的任何一个无效,希望这能有所帮助。如果我错了,请有人纠正我,但如果密码可以是您正在寻找的要求的任意组合,您可能需要一次验证一个,但如果模式始终相同,那么一行正则表达式就可以了,例如,如果总是这样:
Qwe12;,.
[Capital Letter(s)][lowercase letter(s)][number(s)][special character(s)]
然后,一行正则表达式将相对容易地验证它,但如果它可以是您的需求的任意组合,例如
weQ,.12
或
然后,一次验证一个可能更容易,因此:
First check for caps [A-Z]
Then lowercase [a-z]
Then numbers [0-9]
Then special characters [[\^$.|?*+()]
因此,如果这些失败密码中的任何一个无效,希望这能有所帮助。您的正则表达式中有一个细微的缺陷:
[@#$%&+=-_]
^
字符类中的破折号指定一个,这意味着如果密码中包含以下任何字符,则您的字符类将注册“正”匹配:
@,#,$,%,&,+,=,>,?,@,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,[,\,],^_
如果将-
和
转置,可以避免此问题:
[@#$%&+=_-]
位于字符类中第一个或最后一个位置的破折号将失去其特殊含义,并被视为文字破折号
此外,在模式的开头和结尾不需要*
。您的零宽度断言(也称为“lookaheads”)已经包含*
,因此这是多余的,只会导致您的正则表达式在负匹配时变慢。如果只使用正则表达式测试输入,则可以从第一个字符开始,而不需要捕获任何内容:
"^(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=_-])"
如果您还想捕获密码,则可以使用:
"^(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=_-]).*"
只是为了好玩,如果您想设置密码的最大限制,您可以在第一次前瞻中这样做:
^(?=.{8,30}$)
如果要允许用户在密码中包含回车符,请确保使用
查看正在运行的正则表达式,您的正则表达式中有一个细微的缺陷:
[@#$%&+=-_]
^
字符类中的破折号指定一个,这意味着如果密码中包含以下任何字符,则您的字符类将注册“正”匹配:
@,#,$,%,&,+,=,>,?,@,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,[,\,],^_
如果将-
和
转置,可以避免此问题:
[@#$%&+=_-]
位于字符类中第一个或最后一个位置的破折号将失去其特殊含义,并被视为文字破折号
此外,在模式的开头和结尾不需要*
。您的零宽度断言(也称为“lookaheads”)已经包含*
,因此这是多余的,只会导致您的正则表达式在负匹配时变慢。如果只使用正则表达式测试输入,则可以从第一个字符开始,而不需要捕获任何内容:
"^(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=_-])"
如果您还想捕获密码,则可以使用:
"^(?=.{8,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&+=_-]).*"
只是为了好玩,如果您想设置密码的最大限制,您可以在第一次前瞻中这样做:
^(?=.{8,30}$)
如果要允许用户在密码中包含回车符,请确保使用
查看正在使用的正则表达式,并尝试以下方法:
((?=.*\d)(?=.[a-z])(?=.[a-z])(?=.[@$%])。{8,20}
在d(?=.*\\d)
之前有一个双反斜杠。尝试删除它,它应该工作。按照您的方式,您会要求您的密码至少包含一次\d
(字面意思)而不是“至少一个数字”…我的意思是,除去两个反冲,只留下一个,如下所示:(?=.*\d)
仍然没有按照预期的方式工作。澄清一下:它可以识别特殊字符,但是如果我输入了一个没有特殊字符的密码,它仍然会说它是有效的。例如:“Password123”应该无效,但是正则表达式说它是有效的,这((?=.*\d)(?=.[a-z])(?=.[a-z])(?=.[@$%])。{8,20}
在d(?=.*\\d)
之前有一个双反斜杠。尝试删除它,它应该工作。按照您的方式,您会要求您的密码至少包含一次\d
(字面意思)而不是“至少一个数字”…我的意思是,除去两个反冲,只留下一个,如下所示:(?=.*\d)
仍然没有按照预期的方式工作。澄清一下:它可以识别特殊字符,但是如果我输入了一个没有特殊字符的密码,它仍然会说它是有效的。示例:“Password123”应该无效,但正则表达式表示它是vali