我需要一个正则表达式来测试以下用户密码:
最少8个字符,包含字母数字格式,不超过4个连续数字,密码中没有ID(即不能使用:1234
,9876
,abcd
或{{ 1}})
我目前正在使用1234abvc
并且效果很好,但不考虑连续的字符片段。我不确定如何添加它。
任何帮助都会很棒!
答案 0 :(得分:5)
使用多个实现特定规则的正则表达式比将它们全部合并为一个字符串要容易得多。
考虑到这一点,连续性会因这种正则表达式而失败:
"[a-zA-Z]{4}"
or
"\d{4}"
答案 1 :(得分:4)
我不能代表所有人,但我更愿意看到这而不是正则表达式:
bool IsAcceptedPassword(string password, string id)
{
if (password.Contains(id)) {
return false;
}
if (password.Length < 8) {
return false;
}
// Adjust allowed characters here
const string allowedChars = "abcdefghijklmnopqrstuvwxyz0123456789@#$*%";
const string restrictRunsOf = "0123456789";
const int MaxRunLength = 4;
int currentRunLength = 0;
foreach(var ch in password) {
if (allowedChars.IndexOf(ch) == -1) {
return false;
}
if (restrictRunsOf.IndexOf(ch) == -1) {
currentRunLength = 0;
}
else if(++currentRunLength > MaxRunLength) {
return false;
}
}
return true;
}
如果您想让调用者知道为什么不接受密码,您可以返回enum
类型或抛出异常。我更喜欢enum
方法。
答案 2 :(得分:3)
使用(评论)正则表达式轻松完成:
if (Regex.IsMatch(subjectString,
@"# Password: 8-15 alphanums but no more than 3 consecutive digits.
\A # Anchor to start of string.
(?!.*?[0-9]{4}) # No more than three consecutive digits.
[a-zA-Z0-9!@#$*%]{8,15} # Match from 8 to 15 alphanum chars.
\Z # Anchor to end of string.
",
RegexOptions.IgnorePatternWhitespace)) {
// Successful match
} else {
// Match attempt failed
}
答案 3 :(得分:1)
如果你想用正则表达式解决它,只需添加一个负前瞻断言。您可以对其进行测试here
^(?!.*\d{4,}.*)([a-zA-Z0-9!@#$*%]{8,})$
添加的部分(?!.*\d{4,}.*)
不会消耗您的字符串,只会检查一行中是否有4个或更多数字,如果是,则为false。
为什么要将密码限制为15个字符?我在我的例子中删除了这个。