Проверка того, содержит ли пароль только две заглавные буквы с использованием REGEX [duplicate]

COUNTER PRIMITIVE

Давайте определим функции обратного вызова следующим образом:

// ****************************
// COUNTER BEING A PRIMITIVE
// ****************************
function test1() {
    for (var i=0; i<2; i++) {
        setTimeout(function() {
            console.log(i);
        });
    }
}
test1();
// 2
// 2

По завершении таймаута он будет печатать 2 для обоих. Это связано с тем, что функция обратного вызова обращается к значению, основанному на лексической области , где была определена функция.

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

function test2() {
    function sendRequest(i) {
        setTimeout(function() {
            console.log(i);
        });
    }

    for (var i = 0; i < 2; i++) {
        sendRequest(i);
    }
}
test2();
// 1
// 2

Теперь в этом особенность: «Примитивы передаются по значению и копируются. Таким образом, когда ограничение определено, они сохраняют значение из предыдущего цикла».

COUNTER BEING OBJECT

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

// ****************************
// COUNTER BEING AN OBJECT
// ****************************
function test3() {
    var index = { i: 0 };
    for (index.i=0; index.i<2; index.i++) {
        setTimeout(function() {
            console.log('test3: ' + index.i);
        });
    }
}
test3();
// 2
// 2

Итак, даже если для переменной, передаваемой как объект, создается замыкание, значение индекса цикла не будет сохранено. Это означает, что значения объекта не копируются, а к ним обращаются через ссылку.

function test4() {
    var index = { i: 0 };
    function sendRequest(index, i) {
        setTimeout(function() {
            console.log('index: ' + index);
            console.log('i: ' + i);
            console.log(index[i]);
        });
    }

    for (index.i=0; index.i<2; index.i++) {
        sendRequest(index, index.i);
    }
}
test4();
// index: { i: 2}
// 0
// undefined

// index: { i: 2}
// 1
// undefined

2
задан timolawl 15 May 2016 в 11:57
поделиться

4 ответа

Вы можете использовать regex lookaheads :

/^(?=(?:.*[A-Z].*){2})(?!(?:.*[A-Z].*){3,})(?=(?:.*\d.*){3})(?!(?:.*\d.*){4,}).*$/gm

Объяснение:

^                     // assert position at beginning of line
(?=(?:.*[A-Z].*){2})  // positive lookahead to match exactly 2 uppercase letters
(?!(?:.*[A-Z].*){3,}) // negative lookahead to not match if 3 or more uppercase letters
(?=(?:.*\d.*){3})     // positive lookahead to match exactly 3 digits
(?!(?:.*\d.*){4,})    // negative lookahead to not match if 4 or more digits
.*                    // select all of non-newline characters if match
$                     // end of line
/gm                   // flags: "g" - global; "m" - multiline

Regex101

1
ответ дан timolawl 26 August 2018 в 15:29
поделиться

Мне кажется, вам нужен только один взгляд.

^(?=(?:\D*\d){3}\D*$)(?:[^A-Z]*[A-Z]){2}[^A-Z]*$
  • \d - short для цифры. \D является отрицанием \d и соответствует незначению
  • (?= открывает положительный lookahead . (?: открывает группу захвата .
  • В начале ^ start (?=(?:\D*\d){3}\D*$) смотрит ровно на три цифры, пока $ end .
  • Если условие успешно (?:[^A-Z]*[A-Z]){2}[^A-Z]* соответствует строке с ровно двумя верхними альфами, пока $ не закончится. [^ открывает отрицательный класс символов .

Демонстрация в regex101

Если вы хотите разрешить только буквенно-цифровые символы, замените [^A-Z] на [a-z\d] , как в этой демонстрации .

1
ответ дан Community 26 August 2018 в 15:29
поделиться

Без lookahead, чистое выражение:

http://regexr.com/3ddva

В принципе, просто проверяет каждый случай.

0
ответ дан Kenny Lau 26 August 2018 в 15:29
поделиться

Решение с использованием функции String.match:

function checkWord(word) {
    var numbers = word.match(/\d/g), letters = word.match(/[A-Z]/g);

    return (numbers.length === 3 && letters.length === 2) || false;
}

console.log(checkWord("HelLo1aa2s3d"));  // true
console.log(checkWord("WindowA1k2j3"));  // true
console.log(checkWord("AAAsjs21js1"));   // false
console.log(checkWord("ASaaak12"));      // false
1
ответ дан RomanPerekhrest 26 August 2018 в 15:29
поделиться
Другие вопросы по тегам:

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