Неправильная проверка 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 шт):
Одно и то же регулярное выражение, использованное повторно на другом тексте, может дать другой результат
Если мы применяем одно и то же регулярное выражение последовательно к разным строкам, это может привести к неверному результату, поскольку вызов 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