Нужно регулярное выражение для требований пароля - PullRequest
2 голосов
/ 28 марта 2011

Мне нужно регулярное выражение для проверки пароля пользователя для:

Должно быть не менее 8 символов в алфавитно-цифровом формате, не более 4 последовательных чисел, без идентификатора в пароле (то есть нельзя использовать: 1234, 9876, abcd или 1234abvc)

В настоящее время я использую ^([a-zA-Z0-9!@#$*%]{8,15})$, и он отлично работает, но не учитывает количество последовательных символов. Я не уверен, как добавить это в микс.

Любая помощь будет отличной!

Ответы [ 4 ]

5 голосов
/ 28 марта 2011

Было бы намного проще использовать несколько регулярных выражений, которые реализуют определенное правило, чем объединять их все в одну строку.

С учетом этого последовательные сбои с таким регулярным выражением:

"[a-zA-Z]{4}"
  or
"\d{4}"
4 голосов
/ 28 марта 2011

Я не могу говорить за всех, но я бы предпочел видеть это вместо регулярного выражения:

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.

3 голосов
/ 28 марта 2011

Легко сделать с помощью ( прокомментированного ) регулярного выражения:

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
} 
1 голос
/ 28 марта 2011

Если вы хотите решить это с помощью регулярных выражений, просто добавьте отрицательное прогнозное утверждение. Вы можете проверить это здесь

^(?!.*\d{4,}.*)([a-zA-Z0-9!@#$*%]{8,})$

Добавленная часть (?!.*\d{4,}.*) не использует вашу строку, она просто проверяет, есть ли в строке 4 или более чисел, и если да, то ложна.

Почему вы хотите ограничить пароли до 15 символов? Я удалил это в моем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...