我测试了这种模式,它按预期工作 . Tested on ReFiddle here: http://refiddle.com/110
Edit: 一个小注释, easiest 方法是使用3个单独的正则表达式和字符串的 Length 属性 . 它's also easier to read and maintain, so do it that way if you have the option. If this is for validation rules in markup, though, you'可能坚持使用单一的正则表达式 .
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 less than or greater than 12 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 characters";
return false;
}
else
{
return true;
}
}
//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);
9 回答
很长,也许可以缩短 . 支持特殊字符
?"-_
.试试这个(对大写和小写也进行了校正检查,因为你将它们分组为[a-zA-Z]它只有一个低或高的至少一个它有一个错误 . 所以将它们分开):
Update: I found that the regex doesn't really work as expected and this is not how it is supposed to be written too!
尝试这样的事情:
(8到15之间,包含至少一个数字,至少一个大写,至少一个小写,没有空格 . )
我认为这也更容易理解 .
这里似乎有很多混乱 . 到目前为止我看到的答案没有正确执行1个数字/ 1个小写/ 1个大写规则,这意味着仍然可以接受像 abc123 , 123XYZ 或 AB&^#* 这样的密码 . 防止全小写,全大写或全数字是不够的;你必须强制执行每个中至少一个的存在 .
请尝试以下方法:
如果你还想要至少一个特殊字符(这可能是一个好主意),试试这个:
如果您愿意,可以使
.{8,15}
更具限制性(例如,您可以将其更改为\S{8,15}
以禁止空格),但请记住,这样做会降低密码方案的强度 .我测试了这种模式,它按预期工作 . Tested on ReFiddle here: http://refiddle.com/110
Edit: 一个小注释, easiest 方法是使用3个单独的正则表达式和字符串的
Length
属性 . 它's also easier to read and maintain, so do it that way if you have the option. If this is for validation rules in markup, though, you'可能坚持使用单一的正则表达式 .正则表达式是一种比更明显的方式更容易/更好的方法来强制执行简单约束吗?
您认为3年后需要修改约束的维护程序员会更容易理解?
您可以尝试这种方法:
我想它应该是这样的:
这将检查您的角色类的约束,然后检查您是否有8到15个字符 . 哪些字符不再重要,因为您已经检查过您的约束是否匹配 .
我会一个一个地检查它们;即查找一个数字
\d+
,如果失败,您可以告诉用户他们需要添加一个数字 . 这样可以避免返回"Invalid"错误,而不会暗示用户有什么错误 .谢谢尼古拉斯凯莉 . 我首先要使用正则表达式,但你写的内容改变了我的想法 . 以这种方式维护要容易得多 .
可以试试这个:
此外,您可以使用此页面检查正则表达式:
http://rubular.com/r/ckRwasekcd