Почему `pattern.test(name)` противоположный результат при последовательных вызовах

Почему этот код возвращает true, а false

var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";

console.log('1', pattern.test(name));
console.log('1', pattern.test(name));

Демо: Fiddle

Ответ 1

g предназначен для повторения поиска. Он изменяет объект регулярного выражения на итератор. Если вы хотите использовать функцию test, чтобы проверить, что ваша строка действительна в соответствии с вашим шаблоном, удалите этот модификатор:

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";

Функция test, в отличие от replace или match, не потребляет всю итерацию, что позволяет ей "плохо". Вероятно, вы никогда не должны использовать этот модификатор при использовании функции test.

Ответ 2

Вы не хотите использовать gi в сочетании с pattern.test. Флаг g означает, что он отслеживает, где вы работаете, чтобы его можно было повторно использовать. Поэтому вместо этого вы должны использовать:

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";

console.log('1', pattern.test(name));
console.log('1', pattern.test(name));

Кроме того, вы можете использовать синтаксис /.../[flags] для регулярного выражения, например:

var pattern = /mstea/i;

Ответ 3

Поскольку вы устанавливаете модификатор g.

Удалите его для вашего дела.

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";

Ответ 4

Это не ошибка.

g заставляет его выполнить следующее попытанное соответствие для подстроки после первого совпадения. И именно поэтому он возвращает false в каждой попытке.

First attempt: 
It is testing "Amanda Olmstead"

Second attempt:
It is testing "d" //match found in previous attempt (performs substring there)

Third attempt:
It is testing "Amanda Olmstead" again //no match found in previous attempt

... so on

Страница MDN для Regexp.exec:

Если ваше регулярное выражение использует флаг "g", вы можете использовать exec метод несколько раз, чтобы найти последовательные совпадения в одной строке. Когда вы это сделаете, поиск начинается с подстроки строки, указанной в свойство lastIndex регулярного выражения

Страница MDN для test:

Как и в случае с exec (или в сочетании с ним), тест называется несколько раз на том же глобальном экземпляре регулярного выражения будет продвигаться мимо предыдущий матч.