【问题标题】:.NET RegEx to validate password between 6 and 20 characters with at least one upper case letter, one lower case letter and one digit.NET RegEx 验证 6 到 20 个字符之间的密码,其中至少一个大写字母、一个小写字母和一个数字
【发布时间】:2010-12-07 02:18:24
【问题描述】:

我需要一个正则表达式来验证具有以下规格的密码:

长度必须在 6 到 20 个字符之间,至少一个大写字母、一个小写字母和一个数字

【问题讨论】:

  • 你试过什么?您能否在此问题中添加任何内容,使其读起来不像“为我做我的工作”请求?
  • 不太可能有人会做你的功课
  • 其实很有可能,但要付出声望的代价。
  • 我不明白为什么当有人请求帮助编写正则表达式时,人们会变得如此畸形。这是 StackOverflow 完全可以接受的有效问题。要么帮忙,要么不帮忙。
  • @Steve:好吧,既然你问了,这让我很困扰,因为 a) 被寻求帮助但不愿意帮助自己的人惹恼是人类的普遍反应,b) 语气使它我很清楚 OP 会使用答案,但不会试图理解它,而且他的软件(我有一天可能会使用)会变得更糟。

标签: c# regex


【解决方案1】:

我认为这可行:

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

这里是test cases in Regex Hero

这个想法是使用积极的前瞻来确保密码中至少包含一个小写字母、一个大写字母和一个数字。然后作为最后一步,我只需指定一个点以允许 6-20 个字符范围内的任何字符。

【讨论】:

  • 那行不通。这将传递 100 个或更多字符的值。
  • 会匹配“a1A====”这样的字符串吗?这似乎符合 Jangwenyi 的标准。
  • 不要忘记 ^ 和 $ 否则它将匹配无限的密码长度:^(?=.*[AZ])(?=.*[az])(?=.*[0- 9])[A-Za-z0-9]{6,20}$
  • 很好,但这并不妨碍其他字符打破长度限制。此外,严格来说,Jangwenyi 并没有说只需要 [a-zA-Z0-9]{6}。所以 %%%Aa1 应该被允许并且 ABCDEabcde1234512345%%%%%%%%% 应该被禁止,但是你的正则表达式正好相反。
  • 不,是的,我知道正则表达式很强大,但往往存在很多陷阱和无法预料的问题,以至于它们最终变得过于复杂和不可靠。
【解决方案2】:

正则表达式用于搜索,而不是用于验证。您不应努力在单个正则表达式中执行此操作。

话虽如此,既然您正在寻找字符类,并且由于正则表达式对它们的支持非常好,我建议您使用两个或三个正则表达式,检查每个正则表达式是否匹配。

    bool IsPasswordValid(string password)
    {
        if (string.IsNullOrEmpty(password) ||
            password.Length > 20 ||
            password.Length < 6)
        {
            return false;
        }
        else if(!Regex.IsMatch(password, "\d") ||
            !Regex.IsMatch(password, "[a-z]") ||
            !Regex.IsMatch(password, "[A-Z]"))
        {
            return false;
        }
        else
        {
            return true;
        }
    }

这比尝试在过于复杂的正则表达式中编码所有可能的组合更有效。

【讨论】:

  • 正则表达式一直用于验证。
  • 同意,但这不是它们的用途。查找所有有效 IP 地址的正则表达式比验证 IP 地址的正则表达式更简单、更有效。正则表达式是一种搜索工具。对验证很有用,是的,但不是为此而生的。
  • -1:搜索模式,它是一种验证类型;虽然这个正则表达式可能会很复杂,但我认为这是一种有效的方法
  • 我同意,这更容易阅读和维护。想想有人试图维护发布的其他正则表达式。
  • 说正则表达式不用于验证是完全错误的。 正则表达式发明作为简明描述常规语言的成员规则的一种方式。常规语言是那些其成员可以由有限状态机确定,即验证的语言。在正则语言的研究史上,可以使用正则表达式进行搜索是后来出现的。如果您对这个主题感兴趣,我开始(但从未完成)关于它的一系列文章:blogs.msdn.com/ericlippert/archive/tags/Regular+Expressions/…
【解决方案3】:

这允许空格和特殊字符,但应遵循您的规范:

^(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).{6,20}$

我使用Expresso 来帮助测试我的 .Net 正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2016-02-08
    • 2018-01-23
    • 2016-12-14
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多