Урок: почему test() чередует true и false
Повторная проверка одной строки может дать разные результаты, если используется глобальное регулярное выражение. Причина часто находится в lastIndex, а не в изменении исходного текста.
Назначение
Повторная проверка одной строки может дать разные результаты, если используется глобальное регулярное выражение. Причина часто находится в lastIndex, а не в изменении исходного текста.
Как это работает
В учебном файле создайте один RegExp с флагом g и вызовите test несколько раз. Выводите рядом текущую позицию. Затем сравните с выражением без глобального режима, если нужен только логический ответ о наличии совпадения.
Пример
const globalPattern = /a/g;
for (let step = 0; step < 3; step += 1) {
console.log(globalPattern.test("a"), globalPattern.lastIndex);
}
const simplePattern = /a/;
console.log(simplePattern.test("a"), simplePattern.test("a"));
Что должно получиться
Первый глобальный поиск успешен и продвигает позицию, второй не находит следующего совпадения и сбрасывает её. Третий снова начинает с нуля. Выражение без g не создаёт такую последовательность в данном примере.
Граница применения и частая ошибка
Не переиспользуйте stateful-выражение без понимания между независимыми проверками разных полей. Случайный сброс lastIndex может скрыть ошибку проектирования. Если нужен перебор совпадений, сохраняемое состояние полезно; если только проверка формата, g часто лишний.
Самостоятельная проверка
Повторите опыт для строки aa и запишите все позиции. Затем уберите g и сравните. Сформулируйте, где нужен отдельный объект на операцию, а где разумнее использовать неглобальное выражение.