【问题标题】:Regex for at least 8 + upper and lower+numbers or other non-alphabetic至少 8 + 上下 + 数字或其他非字母的正则表达式
【发布时间】:2011-05-17 09:59:30
【问题描述】:
  1. 至少包含 8 个字符。
  2. 包含大小写字母。
  3. 包含数字或其他非字母字符。

上述标准的正则表达式是什么?

我正在创建一个更强的密码检查:)

我正在使用的c#

【问题讨论】:

标签: regex


【解决方案1】:

应该这样做:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^a-zA-Z]).{8,}

请看这里:rubular

解释:

(?=.*?[a-z]) //lookahead, there has to be a lower case alphabetic char
(?=.*?[A-Z]) //lookahead, there has to be a upper case alphabetic char
(?=.*?[^a-zA-Z]) //lookahead, there has to be a non-alphabetic char
.{8,} // any character at least 8 times

【讨论】:

  • 哪组元素在这里指定了特殊的承租人?
  • [^a-zA-Z] 的意思不是字母字符。
【解决方案2】:

不要尝试对所有规则都使用一个正则表达式——这很难,更重要的是,未来的程序员将难以阅读和修改。相反,为每个规则编写一个函数。对第一条规则使用字符串长度函数,然后对大写字母、小写字母和数字使用单独的正则表达式(或字符串的简单扫描)。

然后你的测试变成这样:

if (len(password) >= 8 &&
    contains_lower(password) &&
    contains_upper(password) &&
    contains_number(password)) {
    ...
}

您的代码的意图变得绝对清晰,如果您只需要更改算法的一部分,您就不必重新发明一个复杂的正则表达式。另外,您将能够独立地对每个规则进行单元测试。

将其与某人在此问题的另一个答案中所写的示例进行比较:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^a-zA-Z]).{8,}

这两个答案中哪一个看起来更容易理解、更容易修改和更容易测试?在您花一些(或很多)时间研究它之前,您甚至无法猜测正则表达式在做什么。如果要求更改为“.. 并且至少有一个下划线”怎么办?您如何更改模式,尤其是当 不是最初提出该模式的人时?

【讨论】:

  • +1 太棒了 - 我不知道为什么在 10000000 倍清晰之前我没有想到这个!
  • 不使用正则表达式的另一个重要原因是它们无法告诉用户他的密码不满足您的哪一部分要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多