强密码所需的正则表达式
Reg expression required for strong password
谁能帮我一个正则表达式的密码与以下请。
至少包含以下两项:
为小写字母
大写字母
一个数字
"特殊字符"(例如£,美元,,,#)
下面应该可以工作:
^(?![a-z]*$|[A-Z]*$|'d*$|['W_]*$).*$
示例:http://www.rubular.com/r/effCmvehdx
如果整个字符串完全由一个组组成,那么开头的负向前看将导致此操作失败。
请注意,尽管这符合您的要求,但对于强密码来说,这不是一个很好的正则表达式。您可能还需要长度检查,并且可能需要至少三个这样的组而不是两个。
正如Keith Thompson在评论中所说,我不认为一个正则表达式在这里是值得的。
下面的代码可以做你想做的,我认为它比一个正则表达式更容易读,更容易维护,更容易证明正确性:
string password = "123abc";
string[] regexes = new[]
{
"[a-z]", //any lowercase word
"[A-Z]", //any uppercase word
@"'d", //any digit
@"'W" //special characters (or just [£$&#], adding the characters you want)
};
bool isValid = regexes.Count(regex => Regex.IsMatch(password, regex)) >= 2;
正如我在评论中所说,正则表达式几乎肯定不是这项工作的正确工具。编写一些遍历密码字符的代码,计算每个类中的字符数,会容易得多。
你没有定义什么是"特殊字符"。我假设它指的是除字母或数字(包括空格和控制字符)以外的任何字符。我还假设"字母"只指英语字母表中的26个字母——这意味着像ñ
这样的非英语字母是一个特殊字符。
举一个简单的例子,正则表达式不太擅长表达"foo和bar的任意顺序"这样的东西;您必须显式地指定这两个顺序:
foo.*bar|bar.*foo
在这种情况下,你需要12个不同的选择。我认为这是正确的,但是我还没有测试过。
[a-z].*[A-Z}|[A-Z].*[a-z}|[a-z].*[0-9]|[0-9].*[a-z]|[a-z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[a-z]|[A-Z].*[0-9]|[0-9].*[A-Z]|[A-Z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[A-Z]|[0-9].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[0-9]
这是一个egrep风格或perl风格的正则表达式。grep
默认不识别|
;如果您需要grep
样式的regexp,请将每个|
替换为'|
。
如果需求发生变化,比如需要至少5类字符中的3类,你就需要完全重写正则表达式;你不能只是调整它。
请注意,您的需求仍然允许Aa
。
相关文章:
- 为密码验证实现正则表达式时出现问题
- 正则表达式:密码必须至少包含一个特殊字符
- 如何根据一定的标准在angularjs中使用正则表达式添加密码验证
- 密码验证器javascript正则表达式
- 正则表达式密码允许特殊字符 JavaScript
- 密码正则表达式:“至少 1 个字母、1 个数字、1 个特殊字符,并且不应以特殊字符开头”
- 密码的正则表达式必须包含至少八个字符,至少一个数字以及小写和大写字母以及特殊字符
- 正则表达式密码必须包含字母,至少一个特殊字符和至少一个数字
- 正则表达式的密码(Javascript)
- PHP 和 Javascript 中密码匹配的正则表达式
- 用于密码验证匹配的 Js 正则表达式
- 用于屏蔽连接字符串密码的正则表达式
- 不使用正则表达式的表单密码验证
- 带密码的正则表达式
- 生成密码策略需要正则表达式
- 用于验证密码字段的正则表达式
- 密码正则表达式-带unicode标志的正则表达式中不允许使用原始大括号
- 修改正则表达式密码检查器
- 无法使JavaScript密码正则表达式验证工作
- JavaScript正则表达式密码包含至少6个字符,1个数字,1个字母,任何特殊字符