Я видел следующее регулярное выражение в Интернете.
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[AZ])(?=.*[az]).*$
Он проверяет только, если строка:
* contain at least (1) upper case letter * contain at least (1) lower case letter * contain at least (1) number or special character * contain at least (8) characters in length
Я хотел бы знать, как преобразовать это регулярное выражение, чтобы он проверял строку на
* contain at least (2) upper case letter * contain at least (2) lower case letter * contain at least (2) digits * contain at least (2) special character * contain at least (8) characters in length
Ну, если он содержит как минимум 2 верхних, нижних, цифр и специальных символов, тогда мне не понадобится длина 8 символов.
Специальные символы:
! `~ @ # $% ^ & * () _- + = [] \ | {} ;: '», / <>.?
Лучший способ адаптировать это регулярное выражение состоит в том, чтобы вытащить его и написать код. Необходимое регулярное выражение было бы настолько длинным и сложным, что вы не сможете прочитать его через два часа после того, как вы его написали. Эквивалентный PHP-код будет утомительным, но по крайней мере вы сможете понять, что вы написали.
Между прочим, это не значит, что вы клянутесь. В большинстве случаев регулярные выражения редко подходят для проверки надежности паролей, но ваши требования более сложны, чем обычно, и это просто не стоит. Кроме того, это регулярное выражение, которое вы разместили, – дерьмо. Никогда не доверяйте регулярным выражениям, которые вы находите в Интернете. Или любой код, если на то пошло. Или, черт возьми, что угодно . : – /
Я должен согласиться с Аланом. Если существующее регулярное выражение так сложно, зачем пытаться сделать это только в одном регулярном выражении?
Просто сложите его на простые шаги. Вы уже это сделали.
Теперь напишите 4 регулярных выражения для проверки своих частей, добавьте основную логику в 4 регулярное выражение и измерьте длину строки. Готово.
Что бы вы хотели отлаживать, это:
(?=^(?:[^AZ]*[AZ]){2})(?=^(?:[^az]*[az]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$
(который не работает btw … )
или это:
function valid_pass($candidate) { $r1='/[AZ]/'; //Uppercase $r2='/[az]/'; //lowercase $r3='/[!@#$%^&*()\-_=+{};:,<.>]/'; // whatever you mean by 'special char' $r4='/[0-9]/'; //numbers if(preg_match_all($r1,$candidate, $o)<2) return FALSE; if(preg_match_all($r2,$candidate, $o)<2) return FALSE; if(preg_match_all($r3,$candidate, $o)<2) return FALSE; if(preg_match_all($r4,$candidate, $o)<2) return FALSE; if(strlen($candidate)<8) return FALSE; return TRUE; }
вfunction valid_pass($candidate) { $r1='/[AZ]/'; //Uppercase $r2='/[az]/'; //lowercase $r3='/[!@#$%^&*()\-_=+{};:,<.>]/'; // whatever you mean by 'special char' $r4='/[0-9]/'; //numbers if(preg_match_all($r1,$candidate, $o)<2) return FALSE; if(preg_match_all($r2,$candidate, $o)<2) return FALSE; if(preg_match_all($r3,$candidate, $o)<2) return FALSE; if(preg_match_all($r4,$candidate, $o)<2) return FALSE; if(strlen($candidate)<8) return FALSE; return TRUE; }
Почему люди чувствуют, что им приходится писать регулярное выражение, которое никто не может понять, чтобы они могли сделать это за один проход, вне меня …
Хорошо нормально – если вы действительно хотите использовать одно регулярное выражение, узнайте о взглядах, чтобы проверить свои правила.
Этот монстр делает то, что вы просили за один раз:
^ # start of line (?=(?:.*[AZ]){2,}) # 2 upper case letters (?=(?:.*[az]){2,}) # 2 lower case letters (?=(?:.*\d){2,}) # 2 digits (?=(?:.*[!@#$%^&*()\-_=+{};:,<.>]){2,}) # 2 special characters (.{8,}) # length 8 or more $ # EOL
демонстрация
Если вы действительно хотите использовать регулярное выражение, попробуйте следующее:
(?=^(?:[^AZ]*[AZ]){2})(?=^(?:[^az]*[az]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$
Некоторое объяснение:
(?=^(?:[^AZ]*[AZ]){2})
для двух повторений [^AZ]*[AZ]
который представляет собой последовательность из нуля или более символов, кроме прописных букв, за которыми следует одна буква в верхнем регистре (?=^(?:[^az]*[az]){2})
(то же, что и выше с строчными буквами) (?=^(?:\D*\d){2})
(то же, что и выше, с цифрами) (?=^(?:\w*\W){2})
(то же самое, что и выше, с символами без слов, но вы можете изменить \W
с классом символов любых специальных символов, которые вы хотите) ^[A-Za-z\d\W]{8,}$
проверяет длину всей строки, состоящей только из символа объединения всех других классов символов.