正则表达式至少8 +上下+数字或其他非字母

时间:2011-05-17 09:59:31

标签: regex

  1. 至少包含8个字符。
  2. 包含大写和小写字母。
  3. 包含数字或其他非字母字符。
  4. 上述标准可以是什么?

    我正在检查更强的密码:)

    c#我正在使用

2 个答案:

答案 0 :(得分:13)

这应该这样做:

(?=.*?[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

答案 1 :(得分:11)

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

然后你的测试会变成:

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

您的代码在其意图中变得非常清晰,如果您只需更改算法的一部分,则无需重新创建复杂的正则表达式。此外,您将能够独立地对每个规则进行单元测试。

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

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

这两个答案中的哪一个看起来更容易理解,更容易修改并且更容易测试?你甚至无法猜测正则表达式在做什么,直到你花费一些(或许多)时刻研究它。如果要求变为“..并且至少有一个下划线”怎么办?你如何改变模式,特别是当不是那个提出模式开始的人时?