有人可以帮我提供密码的正则表达式,请使用以下内容。
包括以下至少两项:
小写字母
一封大写字母
一个数字
'特殊字符'(例如£,$,&,#)
答案 0 :(得分:4)
以下内容应该有效:
^(?![a-z]*$|[A-Z]*$|\d*$|[\W_]*$).*$
示例:http://www.rubular.com/r/effCmvehdx
如果整个字符串完全由一个组组成,则开头的否定前瞻将导致此失败。
请注意,尽管这符合您的要求,但这对于强密码来说并不是一个非常好的正则表达式。您可能还需要进行长度检查,并且您可能需要至少三个这样的组而不是两个。
答案 1 :(得分:1)
正如我在评论中所说,正则表达式几乎肯定不是这项工作的正确工具。编写一些迭代密码字符的代码会更加容易,计算每个类中的字符数。
您尚未定义“特殊字符”是什么。我假设它意味着除了字母或数字之外的任何字符(包括空格和控制字符)。我还假设“字母”仅指英文字母的26个字母 - 这意味着像ñ
这样的非英文字母是一个特殊字符。
举一个更简单的例子,正则表达式并不是很擅长表达“foo和bar in any order”之类的东西;你必须明确指定两个顺序:
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
样式的正则表达式,请将每个|
替换为\|
。
如果要求发生变化,比如要求至少有5个字符类别中的3个,则需要完全重写正则表达式;你不能只是调整它。
请注意,您的要求仍允许Aa
。
答案 2 :(得分:1)
正如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;