Регулярное выражение для пользовательских требований к паролю

Я пытался создать регулярное выражение в соответствии с требованиями к паролю. Требование

  • Минимум восемь (8) символов
  • Хотя бы одно число (0-9)
  • Any three of the following:
    • Lowercase
    • Верхний регистр
    • Количество
  • Специальный символ ( ! " # $ % & '() * + , - . / : ; ‹ = > ? @ [ \ ] ^ _ ` { | } ~ )

Я создал это регулярное выражение

/^[0-9a-zA-Z\s!"#$\%&'\(\)\*\+\,\-\.\/\:;<=>?@\[\\\]\^\_\`\{\|\}\~]+$/g

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


person Salman Khan    schedule 03.02.2020    source источник
comment
Если я правильно понял, ваше регулярное выражение ^[long list of alternatives]+$. Что ж, в этом случае он также будет соответствовать hello.   -  person Enlico    schedule 03.02.2020
comment
Сложные правила паролей обычно не приводят к более безопасным паролям, важна лишь минимальная длина. Люди не могут запомнить тонны надежных паролей, и такие правила могут помешать хорошим схемам паролей. Люди могут быть очень изобретательными, чтобы обойти такие правила, например. используя слабые пароли, такие как Password-2020. Часто вы получаете более слабые пароли вместо более надежных. NIST опубликовал официальный документ, в котором советует не свои прежние рекомендации.   -  person martinstoeckli    schedule 03.02.2020


Ответы (2)


Вы можете попробовать это

^(?=.*\d)[ !"#$%&'()*+,.\/:;<=>?@[\]^`{|}~\w-]{8,}$

введите здесь описание изображения


Пример кода

const regex = /^(?=.*\d)[ !"#$%&'()*+,.\/:;<=>?@[\]^`{|}~\w-]{8,}$/gm;
const str = `1234
adnc
123456789
abcdefghij
ABCDEFGHIJ
1ABCDEFG
123-ANCNA
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

PS:  я снова заменил \s в шаблоне на , if you need to match all type of space character you can replace на \s.

person Code Maniac    schedule 03.02.2020

Как насчет этого:

^(?=.{8,})(?=.*?\d)(?=.*[\s!\"#$\%&'\(\)\*\+\,\-\.\/\:;<=>?@\[\\\]\^\_\`\{\|\}\~])(?=[a-zA-Z0-9].*?[a-zA-Z0-9].*?[a-zA-Z0-9].*?).*$

Как видно здесь, на regex101.com

Объяснение:

Я использовал много положительных прогнозов, о которых вы можете узнать больше здесь

По сути, прямой просмотр гарантирует, что перед некоторой позицией есть несколько символов. После проверки того, что начало пароля соответствует всем вашим условиям, мы затем сопоставляем пароль.
Подумайте об этом так: вы проверяете, все ли правильно, и если это так, то вы сопоставляете пароль. В противном случае вы этого не сделаете.

(?=.{8,}) проверяет наличие не менее 8 символов
(?=.*?\d) проверяет наличие хотя бы 1 цифры
^(?=.{8,})(?=.*?\d)(?=.*[\s!\"#$\%&'\(\)\*\+\,\-\.\/\:;<=>?@\[\\\]\^\_\`\{\|\}\~]) проверяет наличие не менее 3 букв и/или цифр

person Robo Mop    schedule 03.02.2020