TypeError: matchAll/replaceAll должен вызываться с глобальным RegExp
JavaScript исключение "TypeError: matchAll/replaceAll must be called with a global RegExp" возникает, когда метод String.prototype.matchAll() или String.prototype.replaceAll() используется с объектом RegExp, у которого не установлен флаг global.
Сообщение
TypeError: String.prototype.matchAll called with a non-global RegExp argument (V8-based) TypeError: String.prototype.replaceAll called with a non-global RegExp argument (V8-based) TypeError: matchAll must be called with a global RegExp (Firefox) TypeError: replaceAll must be called with a global RegExp (Firefox) TypeError: String.prototype.matchAll argument must not be a non-global regular expression (Safari) TypeError: String.prototype.replaceAll argument must not be a non-global regular expression (Safari)
Тип ошибки
Что пошло не так?
Методы String.prototype.matchAll() и String.prototype.replaceAll() требуют объект RegExp с установленным флагом global. Этот флаг указывает, что регулярное выражение может соответствовать всем вхождениям во входной строке, а не останавливаться на первом совпадении. Хотя флаг g является избыточным при использовании этих методов (поскольку эти методы всегда выполняют глобальную замену), он все равно требуется, чтобы прояснить намерение.
Стоит отметить, что проверка флага g выполняется в методах matchAll и replaceAll. Если вместо этого вы используете метод [Symbol.matchAll]() из RegExp, вы не получите эту ошибку, но будет найдено только одно совпадение.
Примеры
Некорректные случаи
"abc".matchAll(/./); // TypeError "abc".replaceAll(/./, "f"); // TypeError
Корректные случаи
Если вы собираетесь выполнить глобальный поиск/замену: либо добавьте флаг g, либо создайте новый объект RegExp с флагом g, если вы хотите сохранить исходное регулярное выражение неизменным.
[..."abc".matchAll(/./g)]; // [[ "a" ], [ "b" ], [ "c" ]]
"abc".replaceAll(/./g, "f"); // "fff"
const existingPattern = /./;
const newPattern = new RegExp(
existingPattern.source,
`${existingPattern.flags}g`,
);
"abc".replaceAll(newPattern, "f"); // "fff"
Если вы намерены выполнить только одно совпадение/замену: используйте String.prototype.match() или String.prototype.replace() вместо этого. Вы также можете использовать метод [Symbol.matchAll](), если вам нужен итератор, подобный тому, что возвращает matchAll, содержащий только одно совпадение, но это будет очень запутанно.
"abc".match(/./); // [ "a" ]
"abc".replace(/./, "f"); // "fbc"
[..././[Symbol.matchAll]("abc")]; // [[ "a" ]]
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Requires_global_RegExp