Шаблон регулярного выражения для проверки пароля - PullRequest
0 голосов
/ 17 января 2011

Я работаю с небольшой проблемой, но не знаю, как ее решить.Я должен проверить сгенерированный пароль, с некоторыми ограничениями:

  • длина пароля: [8, 24]
  • пароль содержит
    • как минимум 1 символ нижнего регистра
    • не менее 1 символа верхнего регистра
    • не менее 1 цифры
    • не менее 1 специального символа (для печати на основе кода ASCII)

Я использовал шаблон Regex, но он не работал правильно в обоих случаях: действительный и недействительный.

Первый шаблон RegEx:

def pattern = /(=?.{8,24})((:?[a-z]+)(:?[0-9]+)(:?[A-Z]+)(:?\W+))/ 

может проверять все недействительные пароли, но не действительный.

Второй шаблон RegEx:

def pattern = /(=?.{8,24})((:?[a-z]*)(:?[0-9]*)(:?[A-Z]*)(:?\W*))/ 

может проверять все действительные пароли, но не для неправильного.

Я новичок в Groovy, поэтому не знаю, как создать правильный шаблон RegEx для решения этой проблемы.Не могли бы вы помочь мне?

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Регулярное выражение не является решением для всего, и попытка придумать единственное регулярное выражение для данной проблемы часто приводит к потере мозговых циклов. Например, просто разделите его на несколько тестов (это псевдокод, подобный Perl, но вы должны иметь возможность преобразовать его в используемый вами язык):

sub valid_pw
{
    return false if (length($_) < 8 || length($_) > 24);
    # don't use [a-z], it makes for nasty surprises in e.g. fi_FI
    return false if (!/[[:lower:]]/);
    return false if (!/[[:upper:]]/);
    return false if (!/[[:digit:]]/);
    return false if (!/[[:print:]]/);
    return true;
}
0 голосов
/ 17 января 2011

Зачем вам нужно одно регулярное выражение для этого?(также, почему вы устанавливаете максимальную длину для пароля, что является еще одним обсуждением)

/^.{8,24}$/
/[a-z]/
/[A-Z]/
/\d/
/[^\d\w]/

Я думаю, вы могли бы объединить их, используя lookaheads (скажем, /(?=.*[a-z])(?=.*[A-Z])...), но если вы это сделаете, то это действительнохорошая идея, чтобы прокомментировать это.

...