Spec-Zone.ru › JavaScript

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)

Тип ошибки

TypeError

Что пошло не так?

Методы 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" ]]

Смотрите также

  • String.prototype.matchAll()
  • String.prototype.replaceAll()
  • RegExp.prototype.global

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API