我环顾了stackoverflow等,但没有找到一个好的答案。正则表达式是否支持编写这样的规则?如果是这样,我们那里有任何正则表达式专家可以帮助我写这篇文章,我是正则表达式的大新手,并且在时间紧迫的情况下......
我知道我可以使用 c# char, number 方法在 c# 中使用手动函数来做到这一点,但如果可以的话,我想使用正则表达式。
要求 :
- 至少 8 个字符长
- 2 个字母
- 2 位数
- 1 大写
- 1 小写
- 1 个符号
你可以使用这个正则表达式
^(?=(.*\d){2})(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z\d]).{8,}$
--------- --------------------- --------------- -----
| | | |->match 8 or more characters
| | |->match further only if theres anything except letter or digit
| |->match further only if there is an upper-lower case letter
|
|->match further only if there are two digits anywhere
您最好为具有所有这些检查的密码编写一个简单的验证例程。
对于这个特定问题,正则表达式似乎不是最好的(或最可扩展的)解决方案。
if(password.Length < 8)
return false;
var letters = 0;
var digits = 0;
var uppers = 0;
var lowers = 0;
var symbols = 0;
foreach(var ch in password)
{
if (char.IsLetter(ch)) letters++;
if (char.IsDigit(ch)) digits++;
....
}
if(letters < 2) return false;
...
我建议采用 Oded 的回答方式,但我认为 LINQ 在这种情况下是一种更具可读性和显式的验证机制。
string p = "psW%Rd32";
return p.Length >= 8 &&
p.Count(c => char.IsDigit(c)) >= 2 &&
p.Count(c => char.IsUpper(c)) >= 1 &&
p.Count(c => char.IsLower(c)) >= 1) ...
你可以试试这个方法。
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,8}");
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 8 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;
}
}