При создании пароля я хочу проверить, соответствует ли входное значение условиям.
правила следующие:
Длина 9 или более символов и 20 символов или менее, без учета пробелов.
Включите хотя бы одну цифру, заглавную букву, строчную букву и специальный символ.
Регулярное выражение для этого правила было создано следующим образом. И это работает хорошо.
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{9,20}$
Пример)
Прописные + строчные + цифра + специальный символ, ОК
Нижний регистр + цифра + специальный символ, НЕТ
Однако на этапе понижения уровня безопасности на один уровень возникла проблема.
Измененные правила заключаются в следующем:
Длина 9 или более символов и 20 символов или менее, без учета пробелов.
Должно содержать не менее 3 из следующих символов: цифры, прописные буквы, строчные буквы и специальные символы.
Пример)
- Прописные + строчные + цифры + специальные символы, ОК
- Нижний регистр + цифры + специальные символы, ОК
- Прописные + строчные + цифры, ОК
- Прописные + строчные + специальные символы, ОК
Пожалуйста, помогите мне!!
Я попробовал составить каждое правило отдельно.
^[\S]{9,20}$
(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*
(?=.*?[^a-zA-Z0-9])(?=.*?[0-9]).*?[a-z].*
(?=.*?[^a-zA-Z0-9])(?=.*?[A-Z]).*?[a-z].*
(?=.*?[^a-zA-Z0-9])(?=.*?[0-9]).*?[A-Z].*
Однако я думаю, что было бы лучше сделать их все сразу, объединив, как раньше.
«Я думаю, что было бы лучше сделать их все сразу, объединив» — на самом деле нет.
Не. Просто убедитесь, что пароль достаточно длинный. Мин. 24 символа. Это намного лучше, чем эти дерьмовые наборы правил.
и 20 символов или меньше"? Зачем людям это делать? В чем причина такого решения? Многим пользователям 20 символов недостаточно.
Итак, вы хотите сопоставить как минимум 3 правила из 4, где правило 1 — это 1 цифра, правило 2 — 1 заглавная буква, правило 3 — 1 строчная буква, а правило 4 — 1 специальный символ, верно?
На самом деле, только что заметил, что ваш пароль принимает практически любые символы, включая смайлы или управляющие символы. Возможно, лучше заменить .{9,20} на [\p{L}\p{N}\p{Sm}\p{Sc}\p{Sk}\p{P}]{9,32}, который будет принимать буквы любого языка, цифры, некоторые группы символов и знаки препинания с использованием классов Юникода. Вы также можете заменить [a-z] на \p{Ll} и [A-Z] на \p{Lu}, чтобы принять «àéü» или «ÜÔ» как допустимые строчные и прописные буквы. Эмодзи, вкладка, вертикальная вкладка или любой другой проблемный символ не пройдут.
Пожалуйста, прочитайте эту страницу о проверке пароля.
Вы можете облегчить жизнь и сохранить возможность обслуживания задачи, если разобьете ее на части. Проверьте длину, а затем проверьте наличие массива условий. Если 3 из 4 успешны -> пройдено (Демо JS на tio.run)





Пытаться:
^((?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W])|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^_\W]*[_\W])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))[\S]{9,20}$
См.: regex101
Объяснение:
Сначала создаются четыре случая, в которых тройное условие может быть действительным. затем строка собирается.
^: начало строки(?:...): условия
(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W]): убедитесь, что все, кроме заглавной буквы|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^_\W]*[_\W]): или используйте все буквы, кроме строчных.|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^_\W]*[_\W]): или убедитесь, что все, кроме цифры|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]): или обеспечить все, кроме особенного\S{9,20}$: сопоставьте от 9 до 20 символов, не являющихся пробелами.@CarySwoveland, пожалуйста, попробуйте отдельные строки, и вы увидите, что это работает. Причина неудачи в ваших настройках заключается в том, что предварительные просмотры могут просматривать разрывы строк и утверждать, что (в данном случае) специальные символы работают. Если это проблема в реальном варианте использования, добавьте [^...]{0,19} вместо [^...]*.
Я понимаю. Если я могу предложить, когда вы ссылаетесь на regex101.com, вы должны включить хотя бы одну тестовую строку. Вы также можете изменить там свое регулярное выражение, чтобы оно больше не поглощало символы новой строки. Например, в недавнем ответе SO я предложил один из терминов регулярного выражения: (?=-[^-]*, что, конечно же, соответствует символу новой строки. Я изменил это на (?=-[^-\n]*, и после моей последней тестовой строки добавил текст: «Примечание: \n включен только в классы символов, чтобы разрешить здесь тестирование регулярного выражения на нескольких строках».
@CarySwoveland Большое спасибо за ваш отзыв! Я не был уверен, не будет ли это просто «ненужно» загромождать фактическое регулярное выражение для целей отображения, поэтому я решил не делать этого. Я все еще думаю, что это хорошее замечание!
Судя по всему, вопрос подразумевает, что специальный символ — это любой символ ASCII, который не является пробелом, цифрой, прописной или строчной буквой.
Пароль проходит различные тесты тогда и только тогда, когда он соответствует следующему регулярному выражению.
^ # match the beginning of the string
(?: # begin a non-capture group
(?=.*[^\s\dA-Za-z]) # pos lookahead asserts string contains a
# special character
(?: # begin a non-capture group
(?=.*\d) # pos lookahead asserts string contains a digit
(?=.*[A-Z]) # pos lookahead asserts string contains an UC letter
| # or
(?=.*\d) # pos lookahead asserts string contains a digit
(?=.*[a-z]) # pos lookahead asserts string contains a LC letter
| # or
(?=.*[A-Z]) # pos lookahead asserts string contains an UC letter
(?=.*[a-z]) # pos lookahead asserts string contains a LC letter
) # end non-capture group
| # or
(?=.*\d) # pos lookahead assert string contains a digit
(?=.*[A-Z]) # pos lookahead asserts string contains an UC letter
(?=.*[a-z]) # pos lookahead asserts string contains a LC letter
) # end non-capture group
[ ]* # match zero or more spaces
(?: # begin non-capture group
[^ ] # match a char other than a space
[ ]* # match zero or more spaces
) # end non-capture group
{9,20} # execute the preceeding non-capture grouip 9-20 times
$ # match the end of the string
Я написал выражение в расширенном режиме (так называемом режиме свободного пространства), чтобы сделать его самодокументируемым. Пробелы, являющиеся частью регулярного выражения, должны быть защищены, иначе они будут удалены на этапе предварительной обработки. Я решил поместить каждый в класс символов ([ ]). Альтернативно, их можно экранировать (\ ) или использовать определенные токены Unicode.
Смотрите в reexegg