#javascript #регулярные_выражения
Нужно настроить регулярное выражение для "Сложного пароля": от 6 символов с использованием цифр, спец. символов, латиницы, наличием строчных и прописных символов. Если введенные символы не соответствуют данному выражению то return false;
Ответы
Ответ 1
Необходимо использовать позитивный просмотр вперёд. Он позволит обеспечить все перечисленные вами условия. Вот так выглядит выражение целиком: /(?=.*[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 и тому подобное. Она призвана только показать подход, который может упростить отладку таких сложных регулярных выражений.Ответ 2
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^\w\s]).{6,}/ Очень похоже, на ответ @VenZell, только лишено недостатка, что жестко ограничен набор допустимых символов. Неправильно требовать от людей "сложный" пароль и при этом ограничивать набор допустимых символов небольшим списком !@#$%^&*. Если производить брутфорс такого пароля, то нет ничего слаще - 56 букв, 10 цифр и 8 символов, итого 74 символа. Ну "очень сложно". Требуя от людей "сложный" пароль имейте ввиду, что они могут захотеть тогда ввести \0 © ♣ и кучу других символов, которые легко вводятся с помощью ALT+3333 как в случае символа трефы.
Комментариев нет:
Отправить комментарий