Неправильная проверка regex каждый второй раз

Описание

Есть массив строк и одно условие regex. Просто проходя по этим строкам циклично проверяю их с помощью RegExp.test():

const regex = new RegExp(`A`, `gmi`);
const examples = [
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
];
for (let index = 0; index < examples.length; index++) {
  const example = examples[index];
  console.log(`${example} -> ${regex.test(example)}`);
}

Специально взял и поставил 8 одинаковых строк в массиве.

Вопрос

Почему каждая вторая проверка возвращает false, если строки одинаковые и условие тот же.


Ответы (1 шт):

Автор решения: SwaD

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

Если мы применяем одно и то же регулярное выражение последовательно к разным строкам, это может привести к неверному результату, поскольку вызов regexp.test обновляет свойство regexp.lastIndex, поэтому поиск в новой строке может начаться с ненулевой позиции.

Например, здесь мы дважды вызываем regexp.test для одного и того же текста, и второй раз поиск завершается уже неудачно:

let regexp = /javascript/g;  // (regexp только что создан: regexp.lastIndex=0)

alert( regexp.test("javascript") ); // true (теперь regexp.lastIndex=10)
alert( regexp.test("javascript") ); // false

Это именно потому, что во втором тесте regexp.lastIndex не равен нулю.

Чтобы обойти это, можно присвоить regexp.lastIndex = 0 перед новым поиском.

const regex = new RegExp(`A`, 'gmi');
const examples = [
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
  `A-3-1`,
];
for (let index = 0; index < examples.length; index++) {
  const example = examples[index];
  regex.lastIndex = 0;
  console.log(regex.test(example));
}

Из документации по regexp-methods

→ Ссылка