Regex для требований к паролю - PullRequest
       25

Regex для требований к паролю

3 голосов
/ 23 октября 2009

Я хочу потребовать следующее:

  • Больше семи символов.
  • Содержит как минимум две цифры.
  • Содержит как минимум два специальных (не буквенно-цифровых) символа.

... и я придумал это, чтобы сделать это:

(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,})

Теперь я также хотел бы убедиться, что никакие два последовательных символа не совпадают. У меня чертовски много времени, чтобы заставить это работать, хотя. Вот что я получил, что работает само по себе:

(\S)\1+

... но если я попытаюсь соединить их вместе, это не получится.


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

В любом случае ...

Используя этот тестовый жгут , я ожидаю, что y90e5 $ будет совпадать, а y90e5 $ $ - нет.

Что мне не хватает?

Ответы [ 4 ]

11 голосов
/ 23 октября 2009

Это плохое место для регулярных выражений. Вам лучше использовать простую проверку.

6 голосов
/ 23 октября 2009

Иногда мы не можем влиять на спецификации и должны писать реализацию независимо от того, когда какая-то древняя бэк-офисная система должна быть подключена через Интернет, но имеет определенные ограничения на ввод или просто потому, что ваш начальник просит вас об этом.

EDIT: удалено регулярное выражение, основанное на исходном регулярном выражении запроса.

изменил исходный код, чтобы он соответствовал вашему описанию, так как он не работал:
РЕДАКТИРОВАТЬ: Q. затем был обновлен, чтобы отразить другую версию. Есть различия, которые я объясню ниже:

Моя версия: два или более \W и \d могут повторяться друг другом, но не могут появляться рядом друг с другом (это было мое неверное предположение), я исправил его для длины> 7, что немного больше Эффективно размещать как типичное выражение "хватай все".

 ^(?!.*((\S)\1|\s))(?=.*(\d.+){2,})(?=.*(\W.+){2,}).{8,}

Новая версия в оригинальном вопросе: два или более \W и \d могут появляться рядом друг с другом. Эта версия в настоящее время поддерживает длину> = 6, а не длину> 7, как объясняется в тексте.

Текущий ответ, исправленный, должен быть примерно таким, который принимает обновленный q., Мои комментарии по длине> 7 и оптимизации, тогда он выглядит так: ^(?!.*((\S)\1|\s))(?=(.*\d){2,})(?=(.*\W){2,}).{8,}.

Обновление: Ваш исходный код не работает, поэтому я немного его изменил
Обновление: обновленный ответ для отражения изменений в вопросе, пробелы больше не разрешены

1 голос
/ 23 октября 2009

Это может быть не самым эффективным, но, похоже, работает.

^(?!.*(\S)\1)(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,})

Тестовые строки:

  • ad2f # we1 $ // совпадение действительно.
  • adfwwe12 # $ // Нет совпадений повторяется ww.
  • y90e5 $$ // Нет совпадений, повторяется $$.
  • y90e5 $ // Слишком короткое соответствие и только значение класса 1 \ W.

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

^(?!.*(\S)\1|.*\s)(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,})

Ваш движок регулярных выражений может анализировать (?!.*(\S)\1|.*\s) по-разному. Просто будьте в курсе и корректируйте соответственно.

Все предыдущие результаты испытаний одинаковы.
Тестовая строка с пробелами:

  • ad2f # we1 $ // Нет пробела в строке.
0 голосов
/ 23 октября 2009

Если бы правило состояло в том, что пароли должны состоять из двух цифр, за которыми следуют три буквы или что-то подобное, или, конечно, регулярное выражение будет работать очень хорошо. Но я не думаю, что регулярные выражения действительно разработаны для того типа правил, который у вас есть. Даже если вы заставите его работать, это будет довольно загадочно для бедного лоха, который должен поддерживать его позже - возможно, для вас. Я думаю, было бы намного проще просто написать быструю функцию, которая перебирает символы и подсчитывает, сколько всего и сколько каждого типа. Затем в конце проверьте количество.

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

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