任何人都可以帮助我使用正则表达式获取以下密码。
至少包括以下两项:
小写字母
大写字母
数字
“特殊字符”(例如 £、$、&、#)
以下应该有效:
^(?![a-z]*$|[A-Z]*$|\d*$|[\W_]*$).*$
示例:http ://www.rubular.com/r/effCmvehdx
如果整个字符串完全由一组组成,则开头的负前瞻将导致失败。
请注意,即使这符合您的要求,这对于强密码来说也不是一个很好的正则表达式。您可能还需要长度检查,并且您可能需要至少三个这些组而不是两个。
正如基思汤普森在评论中所说,我认为一个正则表达式在这里不值得。
下面的代码会做你想做的事,我认为它比单个正则表达式更具可读性、可维护性和更容易证明正确性:
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 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
。