Регулярное выражение для проверки наличия по меньшей мере 3 из 4 различных групп символов

Я пытаюсь написать валидатор паролей.

Как я могу узнать, содержит ли содержащаяся в нем строка не менее трех разных групп символов?

Достаточно легко проверить, существуют ли они или нет, но не менее 3?

  • не менее восьми (8) символов

  • По меньшей мере три разные группы символов

    верхняя буква

    строчная буква

    Числовое

    специальные символы! @# $% &/=? _.,:; -\

(Я использую javascript для regex)

Ответ 1

Просто чтобы узнать - можно ли реализовать такое требование в чистом регулярном выражении?

Это сделало бы его довольно трудным для чтения (и для этого поддерживать!) решение, но вот оно:

(?mx)
^
(
  (?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])                # must contain a-z, A-Z and 0-9
  |                                                # OR
  (?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]\#$%&/=?_.,:;\\-]) # must contain a-z, A-Z and special
  |                                                # OR
  (?=.*[a-z])(?=.*[0-9])(?=.*[[email protected]\#$%&/=?_.,:;\\-]) # must contain a-z, 0-9 and special
  |                                                # OR
  (?=.*[A-Z])(?=.*[0-9])(?=.*[[email protected]\#$%&/=?_.,:;\\-]) # must contain A-Z, 0-9 and special
)
.{8,}                                              # at least 8 chars
$

A (ужасно) Javascript demo:

var pw = "aa$aa1aa";
if(pw.match(/^((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]#$%&\/=?_.,:;\\-])|(?=.*[a-z])(?=.*[0-9])(?=.*[[email protected]#$%&\/=?_.,:;\\-])|(?=.*[A-Z])(?=.*[0-9])(?=.*[[email protected]#$%&\/=?_.,:;\\-])).{8,}$/)) {
  print('Okay!');
} else {
  print('Fail...');
}

печатает: Okay!, как вы можете видеть на Ideone.

Ответ 2

Может также присоединиться к веселью:

String.prototype.isValidPW = function(){   
    // First, check for at least 8 characters
    if (this.length < 8) return false;

    // next, check that we have at least 3 matches
    var re = [/\d/, /[A-Z]/, /[a-z]/, /[[email protected]#$%&\/=?_.,:;-]/], m = 0;
    for (var r = 0; r < re.length; r++){
        if ((this.match(re[r]) || []).length > 0) m++;
    }

    return m >= 3;
};

if ("[email protected]".isValidPW()) alert('Acceptable!');

Демо

Ответ 3

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

var e = password.match(/.{8,}/); //At least 8 chars

var a = password.match(/[0-9]+/); //numeric
var b = password.match(/[A-Z]+/); //Capitals
var c = password.match(/[a-z]+/); //small letters
var d = password.match(/[[email protected]#\$%&/=?_.,:;-\\]+/); //special chars

if (a + b + c + d > 2 && e) {// Success}
else {// Failure}

Ответ 4

http://jsfiddle.net/aSsR8/6/

/**
 * Function determine, wheter we have valid password
 * 
 * @param {String} value
 * @return {Boolean}
 */
function isValidPassword(value) {
    // Here we define all our params
    var validLength = 8,
        minSuccess  = 3,
        isNumeric   = + /\d+/.test(value),
        isCapitals  = + /[A-Z]+/.test(value),
        isSmall     = + /[a-z]+/.test(value),
        isSpecial   = + /[[email protected]#$%&\/=\?_\.,:;\-]+/.test(value);

    if (value.length < validLength) { // 8 symbols. We don`t need regexp here
        return false;
    }

    if (isNumeric + isCapitals  + isSmall + isSpecial < minSuccess) {
        return false;
    }

    return true;
}


document.writeln(isValidPassword('abc'));
document.writeln(isValidPassword('abc123ABC'));
document.writeln(isValidPassword('abc123!23'));

Ответ 5

Малиновый ответ не сработал у меня. Вот что я имею.

var mystring = 'bLahbla\\';
var valid_char_count = 0;
var lc = mystring.match(/[a-z]+/);
var uc = mystring.match(/[A-Z]+/);
var dc = mystring.match(/[0-9]+/);
var sc = mystring.match(/[\!\@\#\$\%\&\=\?\_\.\,\:\;\-\\]/);

if( lc ){ valid_char_count++; }
if( uc ){ valid_char_count++; }
if( dc ){ valid_char_count++; }
if( sc ){ valid_char_count++; }

if( valid_char_count >= 3 ){ /* success */ }

Ответ 6

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

^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W])(?=.*[[email protected]#\$%&/=?_\.,:;-\\]).*$