【问题标题】:Regex for a Complex Password复杂密码的正则表达式
【发布时间】:2017-04-16 06:37:00
【问题描述】:

我已将此正则表达式作为 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.")]

我想让以下密码无效:-

  • 测试
  • 测试1
  • TestTinG123

以下是有效的:-

  • 测试1*
  • T&sting123*
  • %F&y5HD$S

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

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

提前致谢!

【问题讨论】:

  • 就我个人而言,我不会将所有这些要求都塞进一个正则表达式中。您可以使用string.Length 进行长度检查,然后您可以使用 3 个简单的正则表达式来检测至少一个特定类型的字符。 IMO 将更具可读性和更易于维护。

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


【解决方案1】:

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

使用

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

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

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

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

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

请参阅regex demo

【讨论】:

  • 还发现以下似乎工作得很好:- "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[\\W]).{6,}" 其中 \\W 表示任何非字母和非数字。
  • 这取决于你,我不知道要求。问题在于过早关闭的字符类。 [*+\\/|!\"£$%^&amp;*()#[\\]@~'?&gt;&lt;,.=-_]@ 之前的 ] 将其关闭,其余部分被解析为 sequence 字符。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 2013-06-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多