上述标准可以是什么?
我正在检查更强的密码:)
c#我正在使用
答案 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,}
这两个答案中的哪一个看起来更容易理解,更容易修改并且更容易测试?你甚至无法猜测正则表达式在做什么,直到你花费一些(或许多)时刻研究它。如果要求变为“..并且至少有一个下划线”怎么办?你如何改变模式,特别是当你不是那个提出模式开始的人时?