Подтвердить что ты не робот

Javascript regex для пароля, содержащего не менее 8 символов, 1 номер, 1 верхний и 1 строчный регистр

Я пытаюсь написать регулярное выражение для проверки пароля, который должен соответствовать следующим критериям:

  • Содержит не менее 8 символов
  • содержат не менее 1 цифры
  • содержат как минимум один символ нижнего регистра (a-z)
  • содержат как минимум 1 символ верхнего регистра (A-Z)
  • содержит только 0-9a-zA-Z

Я попробовал следующее, но он не работает.

http://jsfiddle.net/many_tentacles/Hzuc9/

<input type='button' value='click' class='buttonClick' />
<input type='text' />
<div></div>

и...

$(".buttonClick").click(function () {

    if ($("input[type=text]").filter(function () {
        return this.value.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8})$/);
    })) {
        $("div").text("pass");
    } else {
        $("div").text("fail");
    }

});

Любые идеи?

4b9b3361

Ответ 1

Я предполагаю, что ваше регулярное выражение должно выглядеть так:

(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/)

Вот объяснение:

(/^
(?=.*\d)                //should contain at least one digit
(?=.*[a-z])             //should contain at least one lower case
(?=.*[A-Z])             //should contain at least one upper case
[a-zA-Z0-9]{8,}         //should contain at least 8 from the mentioned characters
$/)

Ответ 2

Использование отдельных регулярных выражений для тестирования различных частей было бы значительно проще, чем попытка получить одно регулярное выражение для охвата всех них. Это также упрощает добавление или удаление критериев проверки.

Обратите внимание, что использование .filter() неверно; он всегда будет возвращать объект jQuery (который считается правдивым в JavaScript). Лично я бы использовал цикл .each(), чтобы перебирать все входы и сообщать о отдельных состояниях прохода/отказа. Что-то вроде ниже:

$(".buttonClick").click(function () {

    $("input[type=text]").each(function () {
        var validated =  true;
        if(this.value.length < 8)
            validated = false;
        if(!/\d/.test(this.value))
            validated = false;
        if(!/[a-z]/.test(this.value))
            validated = false;
        if(!/[A-Z]/.test(this.value))
            validated = false;
        if(/[^0-9a-zA-Z]/.test(this.value))
            validated = false;
        $('div').text(validated ? "pass" : "fail");
        // use DOM traversal to select the correct div for this input above
    });
});

Рабочая демонстрация

Ответ 3

В вашем регулярном выражении допускается только 8 символов. Используйте {8,} для указания восьми или более вместо {8}.

Но почему бы вам ограничить допустимый диапазон символов для ваших паролей? 8-символьные буквенно-цифровые пароли могут быть грубыми силами моего телефона в течение нескольких минут.

Ответ 4

Не менее 8 = {8,}:

str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/)