C# 需要正则表达式来满足密码要求

C# 需要正则表达式来满足密码要求,c#,regex,passwords,C#,Regex,Passwords,我需要一个正则表达式来测试以下用户密码: 必须至少包含8个字母数字格式的字符,不超过4个连续数字,密码中没有id(即不能使用:1234,9876,abcd,或1234abvc) 我目前正在使用^([a-zA-Z0-9!@#$*%]{8,15})$,它工作得很好,但不考虑连续字符段。我不知道如何把它加入到混合中 任何帮助都会很好 使用多个实现特定规则的正则表达式要比将它们全部合并到一个字符串容易得多 考虑到这一点,使用这种正则表达式,连续字符将失败: "[a-zA-Z]{4}" or "\d{

我需要一个正则表达式来测试以下用户密码:

必须至少包含8个字母数字格式的字符,不超过4个连续数字,密码中没有id(即不能使用:
1234
9876
abcd
,或
1234abvc

我目前正在使用
^([a-zA-Z0-9!@#$*%]{8,15})$
,它工作得很好,但不考虑连续字符段。我不知道如何把它加入到混合中


任何帮助都会很好

使用多个实现特定规则的正则表达式要比将它们全部合并到一个字符串容易得多

考虑到这一点,使用这种正则表达式,连续字符将失败:

"[a-zA-Z]{4}"
  or
"\d{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;
}
bool IsAcceptedPassword(字符串密码,字符串id)
{
if(密码包含(id)){
返回false;
}
如果(密码长度<8){
返回false;
}
//在此调整允许的字符
常量字符串allowedChars=“abcdefghijklmnopqrstuvwxyz012456789@#$*%”;
const string restrictRunsOf=“0123456789”;
const int MaxRunLength=4;
int currentRunLength=0;
foreach(var ch in密码){
if(允许字符索引of(ch)=-1){
返回false;
}
if(限制运行索引Of(ch)=-1){
currentRunLength=0;
}
else if(++currentRunLength>MaxRunLength){
返回false;
}
}
返回true;
}

如果要让调用者知道密码不被接受的原因,可以返回
enum
类型或抛出异常。我更喜欢
enum
方法。

如果您想用regex解决它,只需添加一个否定的前瞻断言。你可以测试一下

添加的部分
(?!.*\d{4,}.*)
不会使用您的字符串,它只是检查一行中是否有4个或更多的数字,如果是,则为false

为什么要将密码限制为15个字符?我在我的示例中删除了此项。

使用(注释)正则表达式即可轻松完成:

if(Regex.IsMatch)(subjectString,
@“#密码:8-15个字母,但不超过3个连续数字。
\一个锚定在绳子的开头。
(?!.[0-9]{4})#不超过三个连续数字。
[a-zA-Z0-9!@$*%{8,15}匹配8到15个字母字符。
\Z#锚定在绳子的末端。
", 
RegexOptions.ignorepattern(空格){
//成功的比赛
}否则{
//匹配尝试失败
} 

连续数字不超过4个?我想问一下,这背后的原因是什么?你想禁止像“12345”、“qwerty”等常见模式吗?另外,像这样单独执行它们将允许你根据失败的“规则”给出不同的错误消息。例如,“Pass不能包含四个连续的数字”,而不是发出一个通用的“passwordinvalid”,并强迫用户找出原因。哎呀,我看你也有同样的想法+1^(?)*?[0-9]{4}[a-zA-Z0-9!@$*%]{8,15}$是最终起作用的。这些要求来自客户,而不是我。
^(?!.*\d{4,}.*)([a-zA-Z0-9!@#$*%]{8,})$