Правильное объединение этого регулярного выражения для подтверждения пароля

#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. Ладно, ты победил, мой плохой