我正在寻找一些密码的模式匹配,并在SO上找到了regex example,但是当我通过一个应该被认为是“强”的密码时,我遇到了相反的情况。例如,字符串“ JlcimYQF + EkH VA *”的评级为1,这意味着正则表达式中的字符串模式不匹配,但是我不确定为什么。
以下代码:
public class PasswordAdvisor
{
public static PasswordScore CheckStrength(string password)
{
int score = 1;
if (password.Length < 12)
return PasswordScore.TooShort;
if (password.Length >= 16)
score++;
if (Regex.Match(password, @"/\d+/", RegexOptions.ECMAScript).Success)
score++;
if (Regex.Match(password, @"/[a-z]/", RegexOptions.ECMAScript).Success &&
Regex.Match(password, @"/[A-Z]/", RegexOptions.ECMAScript).Success)
score++;
if (Regex.Match(password, @"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript).Success)
score++;
return (PasswordScore)score;
}
}
减速:
var passwordStrengthScore = PasswordAdvisor.CheckStrength(@"JlcimYQF+EkH*VA");
Console.WriteLine((int)passwordStrengthScore);
switch (passwordStrengthScore)
{
case PasswordScore.TooShort:
Console.WriteLine("Password is too short");
break;
case PasswordScore.Weak:
Console.WriteLine("Password is very weak");
break;
case PasswordScore.Medium:
Console.WriteLine("OK password");
break;
case PasswordScore.Strong:
Console.WriteLine("Strong password");
break;
case PasswordScore.VeryStrong:
Console.WriteLine("Very strong password");
break;
}
答案 0 :(得分:3)
您应该从所有模式中将/
分隔符删除为.NET regexes are defined with string literals, no delimiters are required,并且这些/
字符是不符合您期望的模式的一部分。
您应将@"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/"
替换为@"[!,@#$%^&*?_~£()-]"
,以要求至少这些特殊字符之一。请注意,文字之间的字符类内部未转义的-
会创建一个范围,因此将其放在末尾(或转义它)会更安全。注意:我将逗号保留在其中,但是由于您将其用作OR运算符,可能应该将其完全删除。 OR关系是正字符类中原子之间的默认关系。
在除Regex.Match(password, @"\d+", RegexOptions.ECMAScript)
以外的所有语句中,您可以安全地删除仅影响速记字符类的RegexOptions.ECMAScript
选项(例如\s
,\d
等)。
使用
if (Regex.Match(password, @"\d+", RegexOptions.ECMAScript).Success)
score++;
if (Regex.Match(password, @"[a-z]").Success &&
Regex.Match(password, @"[A-Z]").Success)
score++;
if (Regex.Match(password, @"[!,@#$%^&*?_~£()-]").Success) // check if you need a comma here
score++;