【问题标题】:How can I validate a password to contain at least one upper-case or lower-case letter?如何验证密码是否至少包含一个大写或小写字母?
【发布时间】:2015-07-14 21:22:07
【问题描述】:

标准

  1. 密码长度 >=8 和
  2. 一位数字 (0-9),一位字母(A-Z 或 a-z),一位特殊字符 (@#$*!)

我试过了

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,15})

但这会同时检查一个小写和大写,但我需要一个。

【问题讨论】:

  • 那么((?=.*\d)(?=.*[a-zA-Z])(?=.*[@#$%]).{8,15})呢?
  • @xanatos 如果一个清楚地表明努力的问题引发了这样的评论,那么这个网站可能不适合你。
  • @Filburt 有两种可能性:他手工构建了该正则表达式,因此他显然很有经验并且知道如何更改它,或者他只是在某个地方找到了它。显然第一个是不可能的,第二个也没有表现出太多的努力。特别是在这种情况下,解决方案是“删除明确标记的 [A-Z] 模式并将其与 [a-z] 模式合并”。即使不知道正则表达式,只要看五分钟,稍微精通编程的人就可以看到它。
  • @xanatos 为什么对使用正则表达式没有多少经验的人要从头开始?
  • @xanatos 少一点轻蔑,像 dcastro 的回答那样采取较轻的一面会更公平。如果你对每一个复制粘贴的菜鸟问题都一无所知,那么一开始你的情况会更糟。我宁愿质疑这是否以前没有得到回答,因此缺乏现场研究。 tldr“你对技术 X 太笨了” 恕我直言。

标签: c# regex passwords


【解决方案1】:

俗话说:“我有问题,所以我想到了使用正则表达式。现在我有两个问题”。

好的方法没有错。

public bool IsPasswordValid(string password)
{
    return password.Length >= 8 &&
           password.Length <= 15 &&
           password.Any(char.IsDigit) &&
           password.Any(char.IsLetter) &&
           (password.Any(char.IsSymbol) || password.Any(char.IsPunctuation)) ;
}

【讨论】:

  • 请注意,您可以使用 char 数组代替 IsSymbol,在其中只放置您想要允许的字符。即 char[] allowedChars = { '@','#','$','*','!'};密码.Any(allowedChars.Contains)
  • "有些人在遇到问题时会想'我知道,我会使用正则表达式'。现在他们有两个问题。” - 杰米扎温斯基
  • 技术上\dIsNumber :-) 而IsLetter 包括A-Za-z 之外的字母,所以你限制了数字并扩大了字母。
  • @SriramSakthivel 我特别喜欢这部分“维护软件的关键是编写可维护的代码。使用正则表达式可能与该目标背道而驰。”。这就是为什么我通常远离复杂的正则表达式的确切原因——即使我正确地编写它并通过单元测试证明它的正确性,明天的开发人员是否能够维护它?
【解决方案2】:

根据this,这是一个包含所有允许的特殊符号的正则表达式:

((?=.*\d)(?=.*[a-zA-Z])(?=.*[@!-'()\+--\/:\?\[-`{}~]).{8,15})

【讨论】:

    【解决方案3】:

    只需删除 AZ 匹配组并使用 RegexOptions.IgnoreCase 声明正则表达式以忽略大小写(即,提供的字母是大写、小写还是两者都无关紧要;az 组仍将匹配它们):

    new Regex(@"((?=.*\d)(?=.*[a-z])(?=.*[@#$%]).{8,15})", RegexOptions.IgnoreCase)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 2013-11-08
      • 2012-01-14
      • 2016-02-08
      相关资源
      最近更新 更多