C# c语言中密码验证的正则表达式#
需要关于正则表达式的帮助以在c中验证密码吗#C# c语言中密码验证的正则表达式#,c#,regex,C#,Regex,需要关于正则表达式的帮助以在c中验证密码吗# 最小长度为8个字符,最大长度为16个字符 至少一位数字,小写和大写各一位 我累的是: var rule = new Regex("^(?=.{8,16}(?=*[a-z])(?=.*[A-Z])(?=.*[0-9])$"); 但是它不起作用:(你忘了在第一个lookahead中添加结束语。而且你还需要在所有lookahead之后添加*,因为是零宽度断言,它不会匹配任何字符,只会断言匹配是否可能 var rule = new Regex(@"^(?=
var rule = new Regex("^(?=.{8,16}(?=*[a-z])(?=.*[A-Z])(?=.*[0-9])$");
但是它不起作用:(你忘了在第一个lookahead中添加结束语。而且你还需要在所有lookahead之后添加
*
,因为是零宽度断言,它不会匹配任何字符,只会断言匹配是否可能
var rule = new Regex(@"^(?=.{8,16}$)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9]).*$");
我喜欢尽量避免使用正则表达式。我会做一些简单的测试:
if (password.Length < 8 || password.Length > 16)
result = "Invalid Length";
else if (!password.Any(char.IsDigit))
result = "Needs a digit";
else if (!password.Any(char.IsLower))
result = "Needs a lowercase";
else if (!password.Any(char.IsUpper))
result = "Needs an uppercase";
else
result = "Good password";
if(password.Length<8 | | password.Length>16)
结果=“无效长度”;
如果(!password.Any(char.IsDigit))
result=“需要一个数字”;
如果(!password.Any(char.IsLower))
result=“需要小写”;
如果(!password.Any(char.IsUpper))
result=“需要大写”;
其他的
结果=“密码正确”;
简单、清晰、易读。此外,您还可以向用户提供特定的反馈。这是一种高级方法,可以清晰地返回输出错误消息
private bool ValidatePassword(字符串密码,out-string错误消息)
{
var输入=密码;
ErrorMessage=string.Empty;
if(string.IsNullOrWhiteSpace(输入))
{
抛出新异常(“密码不应为空”);
}
var hasNumber=新的正则表达式(@“[0-9]+”);
var hasUpperChar=新正则表达式(@“[A-Z]+”);
var hasmimiMaxChars=新正则表达式(@“{8,15}”);
var hasLowerChar=新正则表达式(@“[a-z]+”);
var hasSymbols=new Regex(@“[!@$%^&*()”+=\[{\]};:。/?,-]);
如果(!hasLowerChar.IsMatch(输入))
{
ErrorMessage=“密码应至少包含一个小写字母”;
返回false;
}
如果(!hasUpperChar.IsMatch(输入))为else
{
ErrorMessage=“密码应至少包含一个大写字母”;
返回false;
}
如果(!hasMiniMaxChars.IsMatch(输入))为else
{
ErrorMessage=“密码不应小于或大于12个字符”;
返回false;
}
如果(!hasNumber.IsMatch(输入))为else
{
ErrorMessage=“密码应至少包含一个数值”;
返回false;
}
如果(!hasSymbols.IsMatch(输入))
{
ErrorMessage=“密码应至少包含一个特殊大小写字符”;
返回false;
}
其他的
{
返回true;
}
}
为什么要有一个最大长度。停止。停止。它必须在一个正则表达式中吗?为什么不单独进行每个验证呢?因为这样做更容易,而且可能更可读(因为如果验证规则都是单独的,那么代码中的验证规则会很明显)@Phill:因为存储明文的数据库字段有长度限制?;-)@GregMiller:都德!我包括一个微笑和一切!当然,为了所有其他读者的利益,您是对的,数据库应该只有一个散列。@Lync请注意,正则表达式通常比使用等效字符串方法慢,可能会让不熟悉它们的程序员感到困惑。一般来说,如果你不需要它们,就不要使用它们,但是如果你确实需要它们,就把它们记录下来。。System.ArgumentException:解析“^(?=.{8,16}$)(?=*?[a-z])(?=..[a-z])(?=..[0-9]).*$”-量词{x,y}什么都不跟。我试过了,在定义长度时,{}有可能是问题吗?
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;
}
}