Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 密码策略的正则表达式不起作用_.net_Regex - Fatal编程技术网

.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