Страницы

Поиск по вопросам

суббота, 6 октября 2018 г.

Регулярное выражение для пароля от 6 символов с использованием цифр, спец. символов, латиницы, наличием строчных и прописных символов

Нужно настроить регулярное выражение для "Сложного пароля": от 6 символов с использованием цифр, спец. символов, латиницы, наличием строчных и прописных символов. Если введенные символы не соответствуют данному выражению то return false;


Ответ

Необходимо использовать позитивный просмотр вперёд. Он позволит обеспечить все перечисленные вами условия.
Вот так выглядит выражение целиком:
/(?=.*[0-9])(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z!@#$%^&*]{6,}/g
Вот пример на regex101. Можете попробовать написать свои пароли и проверить работу регулярного выражения на соответствие своим требованиям.
Пояснение:
(?=.*[0-9]) - строка содержит хотя бы одно число; (?=.*[!@#$%^&*]) - строка содержит хотя бы один спецсимвол; (?=.*[a-z]) - строка содержит хотя бы одну латинскую букву в нижнем регистре; (?=.*[A-Z]) - строка содержит хотя бы одну латинскую букву в верхнем регистре; [0-9a-zA-Z!@#$%^&*]{6,} - строка состоит не менее, чем из 6 вышеупомянутых символов.

Основано на ответе на вопрос: "Javascript regular expression password validation having special characters"

Обновление
Важно понять, что для того, чтобы проверить обязательное наличие определённых символов в строке, достаточно использовать такой шаблон: (?=.*[%s]), где вместо %s надо указывать требуемый набор символов.
Шаблон должен быть в самом начале регулярного выражения и присутствовать столько раз, сколько уникальных правил для проверки строки вы хотите использовать.
После отрезка с повторениями этого шаблона необходимо использовать обобщённый набор из всех разрешённых символов. Нам надо склеить «куски» в один общий набор разрешённых символов. Затем к нему надо будет применить ограничение по количеству символов, соответствующее выбранной длине строки.
Чтобы в коде легче читалось такое регулярное выражение, и его было легче проверить, в случае опечатки можно использовать такую функцию для генерации итогового выражения:
function makePasswordRegExp(patterns, min, max) { var min = min || ''; // Если минимальное число символов не указано, берём пустую строку var max = max || ''; // Если максимальное число символов не указано, берём пустую строку var regex_string = ''; var rules = []; var range = "{" + min + "," + max + "}"; // Разрешённый диапазон для длины строки for (rule in patterns) { // Обрабатываем входящий массив из ВСЕХ правил для строки if (patterns.hasOwnProperty(rule)) { rules.push(patterns[rule]); // Запоминаем правила // Формируем последовательность из шаблонов `(?=.*[%s])` // Она проверит обязательное присутствие всех символов из входящего набора regex_string += "(?=.*[" + patterns[rule] + "])"; } } // Добавляем в хвост набор из ВСЕХ разрешённых символов и разрешённую длину строки regex_string += "[" + rules.join('') + "]" + range; // Собираем всё в одно регулярное выражение return new RegExp(regex_string, 'g'); }
Использование:
// Набор правил // Имена ключей в этом объекте могут быть любыми // Они для лучшего понимания частей итогового регулярного выражения var patterns = { 'numeric': '0-9', 'special': '!@#$%^&*', 'latin_lower': 'a-z', 'latin_upper': 'A-Z' };
// В вашем случае есть ограничение только по минимальной длине от 6 символов var min = 6;
// Передаём правила в функцию и смотрим итоговое выражение console.log(makePasswordRegExp(patterns, min));
// Вывод: /(?=.*[0-9])(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z])[0-9!@#$%^&*a-zA-Z]{6,}/g
Безусловно, функцию можно улучшить, добавив в неё проверку большего из двух аргументов min и max и тому подобное. Она призвана только показать подход, который может упростить отладку таких сложных регулярных выражений.

Комментариев нет:

Отправить комментарий