У меня есть следующие критерии для создания регулярного выражения для пароля, соответствующего следующим правилам:
В таком случае пароль должен содержать символы как минимум 3 из следующих 4 правил:
Я могу заставить выражение соответствовать ВСЕМ этим правилам с помощью следующего выражения:
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.[\W]).{8,}$/
Но я не понимаю, как это сделать это так, что ему нужно решить только любые 3 из 4 правил.
Может ли кто-нибудь помочь мне с этим?
Не используйте одно регулярное выражение чтобы проверить это, тогда.
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.
$
Вы могли бы написать для этого действительно сложное регулярное выражение. Вместо этого я предлагаю написать четыре различных регулярных выражения, по одному для каждого правила, и тестировать их одно за другим, подсчитывая, сколько из них соответствует. Если это сделали трое из четырех, примите пароль.
Я бы предложил проводить проверки по отдельности, а затем просто подсчитывать, как много совпадений.
(Я бы также не использовал регулярное выражение ни в одном из них, но это только моя личная точка зрения, а именно то, что они затрудняют чтение и, как правило, представляют собой код с однократной записью)