【发布时间】:2018-06-22 10:49:10
【问题描述】:
我正在寻找对密码进行一些模式匹配,并在 SO 上找到了 regex example,但是当我传递一个应该被视为“强”的密码时,我遇到了相反的情况。例如,字符串“JlcimYQF+EkHVA*”的评分为 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;
}
【问题讨论】:
-
从所有模式中删除
/分隔符。将@"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/"替换为@"[!,@#$%^&*?_~£()-]"也需要这些特殊字符之一。在除Regex.Match(password, @"\d+", RegexOptions.ECMAScript)之外的所有语句中,您可以安全地删除RegexOptions.ECMAScript选项。 -
好的,我添加了答案以提供更多见解。