复杂密码的正则表达式

时间:2016-12-01 14:56:39

标签: c# .net regex asp.net-mvc data-annotations

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

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

我想让以下密码无效: -

  • 测试
  • Testing1
  • 是testing123

以下内容有效: -

  • Testing1 *
  • T&安培; sting123 *
  • %F&安培; y5HD $ S

我想要至少6个字符,至少有一个大写字母,一个小写字母,一个数字和一个特殊字符。我希望上面的正则表达式可以做到这一点,但它允许 Testing12 Tester12 作为有效密码。

我可以在上面做些什么来改变我的期望?我假设上面需要一个大写,一个小写,一个数字和一个特殊字符,但显然我错了?

提前致谢!

1 个答案:

答案 0 :(得分:4)

你忘了正确地逃避](建议把它放在角色类的开头,以便在.NET中它可以被解析为文字] - 用于客户端验证,它甚至需要转义)并记住字符类中的连字符创建一个范围(例如[=-_]),因此它必须放在字符类的结尾/开头或结尾处表示文字-)。

使用

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

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

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

其中[\W_]匹配任何字符,但字符为char(即[^\p{L}\p{N}_]或 - 在客户端 - [^a-zA-Z0-9_])+ _

^$锚点在RegularExpressionAttribute模式中是多余的,但它们不会造成任何伤害。

请参阅regex demo