Я создаю регулярное выражение для проверки пароля, которое будет использоваться в приложении Java в качестве параметра конфигурации.
Регулярное выражение:
^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
Политика паролей:
Не менее 8 символов
Содержит хотя бы одну цифру
Содержит как минимум один нижний альфа-символ и один верхний альфа-символ
Содержит хотя бы один символ в наборе специальных символов (
@#%$^
т. Д.)Не содержит пробелов, табуляции и т. Д.
Мне не хватает только пункта 5. Я не могу проверить регулярное выражение на пробел, табуляцию, возврат каретки и т. Д.
Кто-нибудь может мне помочь?
Ответы:
Попробуй это:
Пояснение:
Добавить, изменить или удалить отдельные правила легко, поскольку каждое правило является независимым «модулем».
(?=.*[xyz])
Конструкция съедает всю строку (.*
) и откатывается на первое вхождение , где[xyz]
может соответствовать. Успешно, если[xyz]
обнаружен, иначе - нет.Альтернативой было бы использование неохотного квалификатора:
(?=.*?[xyz])
. Для проверки пароля это вряд ли будет иметь значение, для гораздо более длинных строк это может быть более эффективным вариантом.Самым эффективным вариантом (но самым трудным для чтения и поддержки, поэтому наиболее подверженным ошибкам)
(?=[^xyz]*[xyz])
, конечно же, будет. Для регулярного выражения такой длины и для этой цели я бы не рекомендовал делать это таким образом, поскольку он не имеет реальных преимуществ.источник
\\s
. Это требование Java, а не требование регулярного выражения.(?=...)
шаблон, чтобы он соответствовал настройке остальной части выражения ..(?=\S+$)
) или «не содержит пробелов» ((?!.*\s)
) - вопрос предпочтения. Используйте то, что вам больше нравится. :)простой пример с использованием регулярного выражения
Пояснения:
(?=.*[0-9])
цифра должна встречаться хотя бы один раз(?=.*[a-z])
строчная буква должна встречаться хотя бы один раз(?=.*[A-Z])
заглавная буква должна встречаться хотя бы один раз(?=.*[@#$%^&+=])
специальный символ должен встречаться хотя бы один раз(?=\\S+$)
во всей строке не допускаются пробелы.{8,}
минимум 8 символовисточник
Во всех приведенных ранее ответах используется один и тот же (правильный) метод для использования отдельного просмотра вперед для каждого требования. Но они содержат пару недостатков и потенциально серьезную ошибку, в зависимости от серверной части, которая действительно будет использовать пароль.
Я начну с регулярного выражения из принятого ответа:
Прежде всего, поскольку Java поддерживает,
\A
и\z
я предпочитаю использовать их, чтобы убедиться, что вся строка проверена независимо отPattern.MULTILINE
. Это не влияет на производительность, но позволяет избежать ошибок при повторном использовании регулярных выражений.Проверить, не содержит ли пароль пробелов и проверить его минимальную длину, можно за один проход, используя все сразу, указав квантификатор переменной
{8,}
в сокращении\S
, ограничивающем допустимые символы:Если предоставленный пароль действительно содержит пробел, все проверки будут выполнены только для того, чтобы окончательная проверка не прошла. Этого можно избежать, заменив все точки на
\S
:Точку следует использовать только в том случае, если вы действительно хотите разрешить использование любого символа. В противном случае используйте (отрицательный) класс символов, чтобы ограничить ваше регулярное выражение только теми символами, которые действительно разрешены. Хотя в данном случае это не имеет большого значения, не использовать точку, когда что-то более подходящее - очень хорошая привычка. Я вижу слишком много случаев катастрофического отката, потому что разработчик был слишком ленив, чтобы использовать что-то более подходящее, чем точка.
Поскольку есть большая вероятность, что начальные тесты найдут подходящий символ в первой половине пароля, ленивый квантификатор может быть более эффективным:
Но теперь перейдем к действительно важному вопросу: ни в одном из ответов не упоминается тот факт, что исходный вопрос, похоже, написан кем-то, кто мыслит в ASCII. Но в Java строки - это Unicode. Допускаются ли в паролях символы, отличные от ASCII? Если да, то запрещены только пробелы ASCII или все пробелы Unicode должны быть исключены.
По умолчанию
\s
соответствует только пробелам ASCII, поэтому его инверсия\S
соответствует всем символам Unicode (пробелам или нет) и всем непробельным символам ASCII. Если символы Unicode разрешены, а пробелы Unicode - нет,UNICODE_CHARACTER_CLASS
можно указать флаг, чтобы\S
исключить пробелы Unicode. Если символы Юникода недопустимы,[\x21-\x7E]
их можно использовать вместо\S
сопоставления всех символов ASCII, не являющихся пробелами или управляющими символами.Это подводит нас к следующей потенциальной проблеме: хотим ли мы разрешить использование управляющих символов? Первый шаг в написании правильного регулярного выражения - точно указать, что вы хотите сопоставить, а что нет. Единственный 100% технически правильный ответ состоит в том, что спецификация пароля в вопросе неоднозначна, поскольку в нем не указано, разрешены ли определенные диапазоны символов, такие как управляющие символы или символы, отличные от ASCII.
источник
Вы не должны использовать слишком сложные регулярные выражения (если вы можете их избежать), потому что они
Хотя при использовании множества небольших регулярных выражений могут возникнуть небольшие накладные расходы на производительность, приведенные выше моменты легко перевешивают их.
Я бы реализовал так:
источник
Требование пароля:
Пароли должны включать символы как минимум двух (2) из этих групп: буквенные, цифровые и специальные символы.
Я протестировал и он работает
источник
Для всех, кто интересуется минимальными требованиями для каждого типа персонажа, я бы предложил сделать следующее расширение принятого ответа Томалака:
Обратите внимание, что это строка форматирования, а не последний шаблон регулярного выражения. Просто замените% d минимально необходимым количеством вхождений для: цифр, строчных, прописных, нецифровых / символов и всего пароля (соответственно). Максимальное количество появлений маловероятно (если вы не хотите, чтобы максимальное значение было равно 0, что эффективно отклоняет любые такие символы), но их также можно легко добавить. Обратите внимание на дополнительную группировку вокруг каждого типа, так что ограничения min / max допускают непоследовательные совпадения. Это творило чудеса для системы, в которой мы могли централизованно настраивать количество требуемых символов каждого типа, а затем веб-сайт, а также две разные мобильные платформы извлекали эту информацию для создания шаблона регулярного выражения на основе указанной выше строки форматирования.
источник
Этот проверяет каждый специальный символ:
источник
Готовый для вас метод Java с параметрами
Просто скопируйте и вставьте и установите желаемые параметры.
Если вам не нужен модуль, просто прокомментируйте его или добавьте «если», как я сделал для специального символа
источник
Используйте библиотеку Passay, которая является мощным API.
источник
Я думаю, что это тоже можно сделать (в более простом режиме):
[Демо Regex]
источник
легкий
("^ (? =. * [0-9]) (? =. * [Az]) (? =. * [AZ]) (? =. * [\\ W _]]» [\\ S] {8 , 10} $ ")
(? = что угодно) -> означает положительный взгляд вперед во всей входной строке и убедитесь, что это условие записано .sample (? =. * [0-9]) -> означает, что во всей строке записано однозначное число. если не написано, вернуть false .
(?! что угодно) -> (наоборот) означает отрицательный взгляд вперед, если записано условие return false .
близкий смысл ^ (условие) (условие) (условие) (условие) [\ S] {8,10} $
источник
Пояснение:
источник
Также вы можете это сделать.
источник
Пример блока кода для надежного пароля:
источник
RegEx - это -
источник