用于密码验证的正则表达式
本文关键字:正则表达式 验证 密码 用于 | 更新日期: 2023-09-27 17:54:06
我目前使用这个正则表达式来检查字符串是否符合一些条件。
条件如下字符串长度为8 ~ 15个字符。字符串必须至少包含一个数字。字符串必须包含至少一个大写字母。字符串必须包含至少一个小写字母。
(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,15})$
在大多数情况下可以使用,但不允许使用特殊字符。如能帮助修改此正则表达式以允许特殊字符,则不胜感激。
这里似乎有很多混乱。到目前为止,我看到的答案并没有正确地执行1+数字/1+小写/1+大写规则,这意味着像abc123、123XYZ或AB&^#*这样的密码仍然可以接受。禁止全小写、全大写或全数字是不够的;您必须强制它们至少有一个存在。
尝试以下操作:
^(?=.*[a-z])(?=.*[A-Z])(?=.*'d).{8,15}$
如果您还希望至少需要一个特殊字符(这可能是一个好主意),请尝试:
^(?=.*[a-z])(?=.*[A-Z])(?=.*'d)(?=.*[^'da-zA-Z]).{8,15}$
如果您愿意,可以将.{8,15}
设置得更严格(例如,您可以将其更改为'S{8,15}
以禁止空格),但请记住,这样做将降低密码方案的强度。
我已经测试了这个模式,它像预期的那样工作。
编辑:一个小注意,最简单的方法是使用3个单独的正则表达式和字符串的Length
属性。它也更容易阅读和维护,所以如果你可以选择这样做。但是,如果这是用于标记中的验证规则,则可能只能使用单个正则表达式。
一个正则表达式是一个更容易/更好的方式来执行一个简单的约束比更明显的方式?
static bool ValidatePassword( string password )
{
const int MIN_LENGTH = 8 ;
const int MAX_LENGTH = 15 ;
if ( password == null ) throw new ArgumentNullException() ;
bool meetsLengthRequirements = password.Length >= MIN_LENGTH && password.Length <= MAX_LENGTH ;
bool hasUpperCaseLetter = false ;
bool hasLowerCaseLetter = false ;
bool hasDecimalDigit = false ;
if ( meetsLengthRequirements )
{
foreach (char c in password )
{
if ( char.IsUpper(c) ) hasUpperCaseLetter = true ;
else if ( char.IsLower(c) ) hasLowerCaseLetter = true ;
else if ( char.IsDigit(c) ) hasDecimalDigit = true ;
}
}
bool isValid = meetsLengthRequirements
&& hasUpperCaseLetter
&& hasLowerCaseLetter
&& hasDecimalDigit
;
return isValid ;
}
你认为3年后需要修改约束的维护程序员会更容易理解哪一个?
您可以试试这个方法:
private bool ValidatePassword(string password, out string ErrorMessage)
{
var input = password;
ErrorMessage = string.Empty;
if (string.IsNullOrWhiteSpace(input))
{
throw new Exception("Password should not be empty");
}
var hasNumber = new Regex(@"[0-9]+");
var hasUpperChar = new Regex(@"[A-Z]+");
var hasMiniMaxChars = new Regex(@".{8,15}");
var hasLowerChar = new Regex(@"[a-z]+");
var hasSymbols = new Regex(@"[!@#$%^&*()_+='[{']};:<>|./?,-]");
if (!hasLowerChar.IsMatch(input))
{
ErrorMessage = "Password should contain at least one lower case letter.";
return false;
}
else if (!hasUpperChar.IsMatch(input))
{
ErrorMessage = "Password should contain at least one upper case letter.";
return false;
}
else if (!hasMiniMaxChars.IsMatch(input))
{
ErrorMessage = "Password should not be lesser than 8 or greater than 15 characters.";
return false;
}
else if (!hasNumber.IsMatch(input))
{
ErrorMessage = "Password should contain at least one numeric value.";
return false;
}
else if (!hasSymbols.IsMatch(input))
{
ErrorMessage = "Password should contain at least one special case character.";
return false;
}
else
{
return true;
}
}
更新上面Justin的回答。如果你想在MVC中使用数据注释,你可以这样做
[RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*'d)(?=.*[^'da-zA-Z]).{8,15}$", ErrorMessage = "Password must be between 6 and 20 characters and contain one uppercase letter, one lowercase letter, one digit and one special character.")]
我会逐一检查;例如,查找数字'd+
,如果失败,你可以告诉用户他们需要添加一个数字。这样可以避免返回"Invalid"错误而不提示用户错误所在。
试试这个(也纠正了大写和小写的检查,它有一个bug,因为你把它们分组为[a- za -z],它只寻找至少一个小写或大写。所以把它们分开):
(?!^[0-9]*$)(?!^[a-z]*$)(?!^[A-Z]*$)^(.{8,15})$
更新:我发现正则表达式并没有像预期的那样工作,这也不是它应该如何写的!
试试这样写:
(?=^.{8,15}$)(?=.*'d)(?=.*[A-Z])(?=.*[a-z])(?!.*'s).*$
(包含8到15之间,包含至少一个数字,至少一个大写字母和至少一个小写字母,不包含空格)
我认为这也更容易理解
我已经修改了@Anurag在其他问题的答案,以满足我的要求:
需要这个方法返回一个列表,显示哪些地方的密码不符合我的策略,所以首先创建了一个包含所有可能问题的Enum:
public enum PasswordPolicyIssue
{
MustHaveNumber,
MustHaveCapitalLetter,
MustHaveSmallLetter,
MustBeAtLeast8Characters,
MustHaveSymbol
}
然后是验证方法,它返回bool值并有一个输出List:
public bool MeetsPasswordPolicy(string password, out List<PasswordPolicyIssue> issues)
{
var input = password;
issues = new List<PasswordPolicyIssue>();
if (string.IsNullOrWhiteSpace(input))
throw new Exception("Password should not be empty");
var hasNumber = new Regex(@"[0-9]+");
var hasUpperChar = new Regex(@"[A-Z]+");
//var hasMiniMaxChars = new Regex(@".{8,15}");
var hasMinChars = new Regex(@".{8,}");
var hasLowerChar = new Regex(@"[a-z]+");
var hasSymbols = new Regex(@"[!@#$%^&*()_+='[{']};:<>|./?,-]");
if (!hasLowerChar.IsMatch(input))
issues.Add(PasswordPolicyIssue.MustHaveSmallLetter);
if (!hasUpperChar.IsMatch(input))
issues.Add(PasswordPolicyIssue.MustHaveCapitalLetter);
if (!hasMinChars.IsMatch(input))
issues.Add(PasswordPolicyIssue.MustBeAtLeast8Characters);
if (!hasNumber.IsMatch(input))
issues.Add(PasswordPolicyIssue.MustHaveNumber);
if (!hasSymbols.IsMatch(input))
issues.Add(PasswordPolicyIssue.MustHaveSymbol);
return issues.Count() ==0;
}
@Anurag的原始答案
很长,可以缩短。支持特殊字符?"-_
'A(?=[-'?'"_a-zA-Z0-9]*?[A-Z])(?=[-'?'"_a-zA-Z0-9]*?[a-z])(?=[-'?'"_a-zA-Z0-9]*?[0-9])[-'?'"_a-zA-Z0-9]{8,15}'z
感谢Nicholas Carey。我本来打算先用正则表达式,但你写的东西改变了我的想法。这样维护起来容易多了。
//You can set these from your custom service methods
int minLen = 8;
int minDigit 2;
int minSpChar 2;
Boolean ErrorFlag = false;
//Check for password length
if (model.NewPassword.Length < minLen)
{
ErrorFlag = true;
ModelState.AddModelError("NewPassword", "Password must be at least " + minLen + " characters long.");
}
//Check for Digits and Special Characters
int digitCount = 0;
int splCharCount = 0;
foreach (char c in model.NewPassword)
{
if (char.IsDigit(c)) digitCount++;
if (Regex.IsMatch(c.ToString(), @"[!#$%&'()*+,-.:;<=>?@[''']{}^_`|~]")) splCharCount++;
}
if (digitCount < minDigit)
{
ErrorFlag = true;
ModelState.AddModelError("NewPassword", "Password must have at least " + minDigit + " digit(s).");
}
if (splCharCount < minSpChar)
{
ErrorFlag = true;
ModelState.AddModelError("NewPassword", "Password must have at least " + minSpChar + " special character(s).");
}
if (ErrorFlag)
return View(model);
模式满足以下条件
- 密码长度8个字符,最大15个字符
- 要求唯一字符
- 需要数字
- 要求小写
- 要求大写
^(?!.*([A-Za-z0-9]))(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,15}$
^^(?=.*[A-Z]{"+minUpperCase+",})(?=.*[a-z]{"+minLowerCase+",})(?=.*[0-9]{"+minNumerics+",})(?=.*[!@#$'-_?.:{]{"+minSpecialChars+",})[a-zA-Z0-9!@#$'-_?.:{]{"+minLength+","+maxLength+"}$