复杂密码的正则表达式

Mik*_*ohn 3 .net c# regex asp.net-mvc data-annotations

我将此正则表达式作为 C# .NET MVC 项目中密码字段的数据注释。

\n\n
[RegularExpression("(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[*+\\\\/|!\\"\xc2\xa3$%^&*()#[\\\\]@~\'?><,.=-_]).{6,}", ErrorMessage = "Password must be between 6 and 20 characters and contain one uppercase letter, one lowercase letter, one digit and one special character.")]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想让以下密码无效:-

\n\n
    \n
  • 测试
  • \n
  • 测试1
  • \n
  • 测试G123
  • \n
\n\n

以下内容是有效的:-

\n\n
    \n
  • 测试1*
  • \n
  • T(&S)123*
  • \n
  • %F&y5HD$S
  • \n
\n\n

我想要至少 6 个字符,其中至少有 1 个大写字母、1 个小写字母、1 个数字和 1 个特殊字符。我希望上面的正则表达式能够做到这一点,但它让Testing12Tester12作为有效密码通过。

\n\n

我可以对上面的内容进行哪些更改以获得我所期望的结果?我假设上面需要一个大写字母,一个小写字母,一个数字和一个特殊字符,但显然我错了?

\n\n

提前致谢!

\n

Wik*_*żew 5

您忘记正确转义](建议甚至将其放在字符类的开头,以便在 .NET 中它可以被解析为文字]- 对于客户端验证,即使在那里也需要转义)并记住字符类中的连字符创建一个范围(例如[=-_]),因此必须将其放在字符类的末尾/开头或放在末尾以表示文字-)。

\n\n

使用

\n\n
"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[\\]*+\\\\/|!\\"\xc2\xa3$%^&*()#[@~\'?><,.=_-]).{6,}$"\n                                         ^^                             ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,如果您只想需要至少 1 个非字母数字字符,请使用

\n\n
"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[\\W_]).{6,}$"\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中[\\W_]匹配除单词字符外的任何字符(即[^\\p{L}\\p{N}_]或 - 在客户端 - [^a-zA-Z0-9_])+ _

\n\n

和锚点在正^$表达式属性模式中是多余的,但它们不会造成任何损害。

\n\n

请参阅正则表达式演示

\n