强密码所需的正则表达式

Reg expression required for strong password

本文关键字:正则表达式 密码      更新时间:2023-09-26

谁能帮我一个正则表达式的密码与以下请。

至少包含以下两项:

为小写字母
大写字母
一个数字
"特殊字符"(例如£,美元,,,#)

下面应该可以工作:

^(?![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