Регулярное выражение для обеспечения соблюдения сложных паролей, соответствующих 3 из 4 правил

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

  1. Пароль должен состоять из 8 символов (это я могу: -)).

В таком случае пароль должен содержать символы как минимум 3 из следующих 4 правил:

  1. Верхний регистр
  2. Нижний регистр
  3. Числа
  4. Не-буквенно-числовой

Я могу заставить выражение соответствовать ВСЕМ этим правилам с помощью следующего выражения:

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

Но я не понимаю, как это сделать это так, что ему нужно решить только любые 3 из 4 правил.

Может ли кто-нибудь помочь мне с этим?

44
задан Simon East 9 September 2017 в 03:50
поделиться

3 ответа

Не используйте одно регулярное выражение чтобы проверить это, тогда.

if (password.length < 8)
  alert("bad password");
var hasUpperCase = /[A-Z]/.test(password);
var hasLowerCase = /[a-z]/.test(password);
var hasNumbers = /\d/.test(password);
var hasNonalphas = /\W/.test(password);
if (hasUpperCase + hasLowerCase + hasNumbers + hasNonalphas < 3)
  alert("bad password");

Если вы должны использовать одно регулярное выражение:

^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\d\W])|(?=.*\W)(?=.*\d))|(?=.*\W)(?=.*[A-Z])(?=.*\d)).{8,}$

Это регулярное выражение не оптимизировано для эффективности. Оно построено по A · B · C + A · B · D + A · C · D + B · C · D с некоторой факторизацией. Разбивка:

^
(?:
    (?=.*[a-z])       # 1. there is a lower-case letter ahead,
    (?:               #    and
        (?=.*[A-Z])   #     1.a.i) there is also an upper-case letter, and
        (?=.*[\d\W])  #     1.a.ii) a number (\d) or symbol (\W),
    |                 #    or
        (?=.*\W)      #     1.b.i) there is a symbol, and
        (?=.*\d)      #     1.b.ii) a number ahead
    )
|                     # OR
    (?=.*\W)          # 2.a) there is a symbol, and
    (?=.*[A-Z])       # 2.b) an upper-case letter, and
    (?=.*\d)          # 2.c) a number ahead.
)
.{8,}                 # the password must be at least 8 characters long.
$
108
ответ дан 26 November 2019 в 21:46
поделиться

Вы могли бы написать для этого действительно сложное регулярное выражение. Вместо этого я предлагаю написать четыре различных регулярных выражения, по одному для каждого правила, и тестировать их одно за другим, подсчитывая, сколько из них соответствует. Если это сделали трое из четырех, примите пароль.

6
ответ дан 26 November 2019 в 21:46
поделиться

Я бы предложил проводить проверки по отдельности, а затем просто подсчитывать, как много совпадений.

(Я бы также не использовал регулярное выражение ни в одном из них, но это только моя личная точка зрения, а именно то, что они затрудняют чтение и, как правило, представляют собой код с однократной записью)

1
ответ дан 26 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: