Нужно настроить регулярное выражение для "Сложного пароля": от 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 и тому подобное. Она призвана только показать подход, который может упростить отладку таких сложных регулярных выражений.
Комментариев нет:
Отправить комментарий