我需要限制用户使用至少8个字符的密码以及小写,大写,数字和特殊字符的混合。我已经使用.Net Regex Test网站进行测试,并得出以下解决方案。在下面的两个链接中,您可以看到mer220d#没有匹配,但Mer220d#完全匹配,但在我的.Net代码中,它使用完全相同的正则表达式,它们都返回true。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BOR.Security.CheckConstraints
{
public class CheckPasswordConstraint
{
public static bool passwordValidation(string passwordToCheck)
{
string pattern = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*\W)[a-zA-Z0-9\S]{8,}$";
Match m = Regex.Match(passwordToCheck.TrimEnd(), pattern, RegexOptions.IgnoreCase);
return m.Success;
}
}
}
你能告诉我我失踪了吗?
答案 0 :(得分:1)
您应删除RegexOptions.IgnoreCase
,因为(?=.*[a-z])(?=.*[A-Z])
与(?=.*[a-zA-Z])
相同,并且只需要1个ASCII字母(小写或大写)即可。
此外,[a-zA-Z0-9\S]
= \S
作为字母和数字都是非空格字符。
此外,您必须修剪字符串的两端,使用.Trim()
,而不是.TrimEnd()
。
此外,建议在密码正则表达式中使用constrast的原理,以提高效率。
使用
字符串模式= @“ ^(?= [^ az] [az])(?= [^ AZ] [AZ])(?= \ D * \ d)(?= \ w * \ W)\ S {8,} $“; 匹配m = Regex.Match(passwordToCheck.Trim(),pattern);
说明
^
-字符串的开头(?=[^a-z]*[a-z])
-必须至少有1个小写ASCII字母(?=[^A-Z]*[A-Z])
-必须至少有1个大写ASCII字母(?=\D*\d)
-至少必须有1位数字(?=\w*\W)
-必须至少有1个非单词字符\S{8,}
-8个或更多非空格字符(无空格,但接受所有其他字符)$
-字符串的结尾。