强密码需要Reg表达式

时间:2013-03-01 20:52:41

标签: javascript .net regex

有人可以帮我提供密码的正则表达式,请使用以下内容。

包括以下至少两项:

小写字母 一封大写字母 一个数字
'特殊字符'(例如£,$,&,#)

3 个答案:

答案 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;