6

任何人都可以帮助我使用正则表达式获取以下密码。

至少包括以下两项:

小写字母
大写字母
数字
“特殊字符”(例如 £、$、&、#)

4

3 回答 3

4

以下应该有效:

^(?![a-z]*$|[A-Z]*$|\d*$|[\W_]*$).*$

示例:http ://www.rubular.com/r/effCmvehdx

如果整个字符串完全由一组组成,则开头的负前瞻将导致失败。

请注意,即使这符合您的要求,这对于强密码来说也不是一个很好的正则表达式。您可能还需要长度检查,并且您可能需要至少三个这些组而不是两个。

于 2013-03-01T21:02:24.393 回答
1

正如基思汤普森在评论中所说,我认为一个正则表达式在这里不值得。

下面的代码会做你想做的事,我认为它比单个正则表达式更具可读性、可维护性和更容易证明正确性:

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; 
于 2013-03-01T21:21:23.370 回答
0

正如我在评论中所说,正则表达式几乎肯定不是这项工作的正确工具。编写一些迭代密码字符的代码会容易得多,计算每个类中的字符数。

您还没有定义什么是“特殊字符”。我假设它表示除字母或数字以外的任何字符(包括空格和控制字符)。我还假设“字母”仅指英文字母表的 26 个字母——这意味着非英文字母ñ是一个特殊字符。

举一个更简单的例子,正则表达式不太擅长表达“foo and bar in either 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-style 正则表达式,请将每个替换|\|.

如果要求发生变化,比如需要至少 5 类字符中的 3 类,您将需要完全重写正则表达式;你不能只是调整它。

请注意,您的要求仍然允许Aa

于 2013-03-01T21:07:10.917 回答