#javascript #jquery #regex #passwords
#javascript #jquery #регулярное выражение #пароли
Вопрос:
Пытаюсь создать функцию jquery, которая проверяет, соответствует ли пароль определенным требованиям, пароль должен содержать не менее 3 символов, будь то прописные, цифры или специальные символы. Это может быть сочетание 3, поэтому может быть 2 заглавных и 1 специальный и т.д….
Я создал функцию, которая проверяет использование регулярного выражения, но она очень длинная, я знаю, что ее можно объединить, но, похоже, я не могу понять, как.
$('#Password').blur(function () {
var pswd = $(this).val();
if (pswd.length > 7) {
if (pswd.match(/(?=(.*[A-Z].*){3,}).{7,}/) // 3 caps
||
pswd.match(/(?=(.*W.*){3,}).{7,}/) // 3 special chars
||
pswd.match(/(?=(.*d.*){3,}).{7,}/) // 3 digits
||
(pswd.match(/(?=(.*[A-Z].*){2,})/ amp;amp; pswd.match(/(?=(.*W.*){1,})/))) // 2 caps 1 special
||
(pswd.match(/(?=(.*[A-Z].*){1,})/ amp;amp; pswd.match(/(?=(.*W.*){2,})/))) // 1 cap 2 special
||
(pswd.match(/(?=(.*[A-Z].*){2,})/ amp;amp; pswd.match(/(?=(.*d.*){1,})/))) // 2 cap 1 digit
||
(pswd.match(/(?=(.*[A-Z].*){1,})/ amp;amp; pswd.match(/(?=(.*d.*){2,})/))) // 1 cap 2 digit
||
(pswd.match(/(?=(.*W.*){2,})/ amp;amp; pswd.match(/(?=(.*d.*){1,})/))) // 2 special 1 digit
||
(pswd.match(/(?=(.*W.*){1,})/ amp;amp; pswd.match(/(?=(.*d.*){2,})/))) // 1 special 2 digit
||
(pswd.match(/(?=(.*W.*){1,})/ amp;amp; pswd.match(/(?=(.*d.*){1,})/) amp;amp; pswd.match(/(?=(.*[A-Z].*){1,})/)))
) // 1 of each /
{
$('#Message').hide();
}
} else {
$('#Message').show();
}
});
Функция работает нормально, но я хочу улучшить регулярное выражение, возможно ли выполнить ту же проверку пароля в лучшее время или сократить код.
Комментарии:
1. Я знаю, что могу объединить то, что находится на стороне каждого условия OR, с a . но есть ли лучший и более эффективный способ.
2. » но оно очень длинное, я знаю, что его можно объединить » вы хотите создать одно регулярное выражение или вы хотите просто сделать вашу функцию более читаемой?
3. Единственное регулярное выражение — это то, что я ищу, я не уверен, что это вообще достижимо.
Ответ №1:
Что делать, если вы учитываете вхождение специального символа в строку, например:
pswd.match(/(?=[A-Z])|(?=[0-9])|(?=[#$^ =!*()@%amp;])/g).length
… и сравните с ‘3’ в вашем случае.
@PJProudhon — Спасибо за предложение:
pswd.match(/[A-Z]|[0-9]|[#$^ =!*()@%amp;]/g).length
Комментарии:
1. Мне это нравится, это отличное решение. Спасибо.
2. Для этого соответствия заглядывать вперед не обязательно.
Ответ №2:
Сосредоточьтесь на «должно содержать не менее 3 символов, являющихся прописными, цифрами или специальными символами».
Вы можете выразить это как: содержит по крайней мере 3 символа, которые не являются строчными. Таким образом, здесь даже не требуется объединение.
Я попробую ^(?=(?:[a-z]*[^a-z]){3}).{7,}$
.
Комментарии:
1. Ладно, ты победил, мой плохой