Условие выполнено, даже если ложно

Я пытаюсь проверить, является ли входное значение буквенно-цифровым. Согласно regex101.com мой regex должен работать. Но все результаты теста в "неверном".

Что я делаю неправильно?

var alphaNumeric = /^[a-z0-9]+$/gi;
var input = "123"; //page.input.getValue().toUpperCase();

console.log(input);

if (input.length == 3) {

  if (alphaNumeric.test(input)) {
    console.log("correct");
  } else {
    console.log("incorrect");
  }
} else {

}

3 ответа

Решение

Смотрите ответ bobince: /questions/18490023/regulyarnoe-vyirazhenie-javascript-vozvraschayuschee-true-zatem-false-zatem-true-i-t-d/18490039#18490039

Вы используете a g (глобальный) RegExp. В JavaScript глобальные регулярные выражения имеют состояние: вы вызываете их (с помощью exec, test и т. Д.) В первый раз, вы получаете первое совпадение в данной строке. Вызовите их снова, и вы получите следующее совпадение, и так далее, пока не получите совпадение, и оно сбрасывается на начало следующей строки. Вы также можете написать regex.lastIndex= 0, чтобы сбросить это состояние.

(Это, конечно, абсолютно ужасный проект, гарантированно запутанный и вызывающий странные ошибки. Добро пожаловать в JavaScript!)

Вы можете опустить g в вашем RegExp, так как вы проверяете только одно совпадение.

Так что в вашем случае у вас будут разные результаты при каждой попытке:

    var alphaNumeric = /^[a-z0-9]+$/gi;
    var input = "123";
    console.log(input);
    if (input.length == 3) {
        for (var i=0; i<5; i++){
            if (alphaNumeric.test(input)) {
                console.log("correct");
            } else {
                console.log("incorrect");
            }
        }

    } else {
        
    }

Избавьтесь от глобального флага (вы все равно начинаете и заканчиваете)

var alphaNumeric = /^[a-z0-9]+$/i;
console.log(alphaNumeric.test("aaa")); // true
console.log(alphaNumeric.test("AAA")); // true
console.log(alphaNumeric.test("123")); // true
console.log(alphaNumeric.test("a1a1a1")); // true
console.log(alphaNumeric.test("ABC-123")); // false

/^[a-z0-9]+$/i

^         Start of string
[a-z0-9]  a or b or c or ... z or 0 or 1 or ... 9
+         one or more times (change to * to allow empty string)
$         end of string    
/i        case-insensitive

/questions/39479131/regex-dlya-javascript-chtobyi-razreshit-tolko-bukvenno-tsifrovoj/39479154#39479154

Так что я думаю, вам нужно удалить г там. желаю удачи

Другие вопросы по тегам