Spec-Zone.ru › JavaScript

RegExp.prototype[Symbol.match]()

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Метод [Symbol.match]() экземпляров RegExp определяет, как должен вести себя String.prototype.match(). Кроме того, его присутствие (или отсутствие) может влиять на то, считается ли объект регулярным выражением.

Попробуйте

class RegExp1 extends RegExp {
  [Symbol.match](str) {
    const result = RegExp.prototype[Symbol.match].call(this, str);
    if (result) {
      return "VALID";
    }
    return "INVALID";
  }
}

console.log("2012-07-02".match(new RegExp1("(\\d+)-(\\d+)-(\\d+)")));
// Expected output: "VALID"

Синтаксис

regexp[Symbol.match](str)

Параметры

str
String, который является целью сопоставления.

Возвращаемое значение

Array, содержимое которого зависит от наличия или отсутствия глобального флага (g), или null, если совпадения не найдены.

  • Если используется флаг g, будут возвращены все результаты, соответствующие полному регулярному выражению, но захватывающие группы не включаются.
  • Если флаг g не используется, возвращается только первое полное совпадение и связанные с ним захватывающие группы. В этом случае match() вернет тот же результат, что и RegExp.prototype.exec() (массив с некоторыми дополнительными свойствами).

Описание

Этот метод существует для настройки поведения сопоставления внутри подклассов RegExp. Он вызывается внутренне в String.prototype.match(). Например, следующие два примера возвращают один и тот же результат.

"abc".match(/a/);

/a/[Symbol.match]("abc");

Если регулярное выражение является глобальным (с флагом g), его lastIndex сначала устанавливается в 0, поэтому сопоставление всегда начинается с начала строки, а метод exec() регулярного выражения многократно вызывается, пока exec() не вернет null. Если текущее совпадение является пустой строкой, lastIndex все равно будет продвигаться — если регулярное выражение поддерживает Юникод, оно будет продвигаться на одну кодовую точку Юникода; в противном случае оно продвигается на одну кодовую единицу UTF-16.

console.log("😄".match(/(?:)/g)); // [ '', '', '' ]
console.log("😄".match(/(?:)/gu)); // [ '', '' ]

Если регулярное выражение не является глобальным, exec() будет вызван только один раз, и его результат становится возвращаемым значением [Symbol.match]().

Метод exec() автоматически сбрасывает lastIndex в 0, когда последнее сопоставление не удается, поэтому для глобальных регулярных выражений, у которых lastIndex начинается с 0, [Symbol.match]() обычно не имеет побочных эффектов. Однако, когда регулярное выражение является липким (sticky), но не глобальным, exec() вызывается только один раз и, следовательно, не сбрасывает lastIndex, если сопоставление было успешным. В этом случае каждый вызов match() может возвращать разный результат.

const re = /[abc]/y;
for (let i = 0; i < 5; i++) {
  console.log("abc".match(re), re.lastIndex);
}
// [ 'a' ] 1
// [ 'b' ] 2
// [ 'c' ] 3
// null 0
// [ 'a' ] 1

Когда регулярное выражение является липким и глобальным, оно все равно будет выполнять липкие сопоставления — то есть, оно не сможет найти совпадения, выходящие за пределы lastIndex.

console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]

Кроме того, свойство [Symbol.match] используется для проверки того, является ли объект регулярным выражением.

Примеры

Прямой вызов

Этот метод можно использовать в почти так же, как String.prototype.match(), за исключением другого this и другого порядка аргументов.

const re = /\d+/g;
const str = "2016-01-02";
const result = re[Symbol.match](str);
console.log(result); // ["2016", "01", "02"]

Использование [Symbol.match]() в подклассах

Подклассы RegExp могут переопределять метод [Symbol.match]() для изменения поведения по умолчанию.

class MyRegExp extends RegExp {
  [Symbol.match](str) {
    const result = RegExp.prototype[Symbol.match].call(this, str);
    if (!result) return null;
    return {
      group(n) {
        return result[n];
      },
    };
  }
}

const re = new MyRegExp("(\\d+)-(\\d+)-(\\d+)");
const str = "2016-01-02";
const result = str.match(re); // String.prototype.match calls re[Symbol.match]().
console.log(result.group(1)); // 2016
console.log(result.group(2)); // 01
console.log(result.group(3)); // 02

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-regexp.prototype-%symbol.match%

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
@@match
50
13
49
37
10
50
49
37
10
5.0
50
10
1.0.0
1.0
6.0.0

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

  • Полифилл RegExp.prototype[Symbol.match] в core-js
  • String.prototype.match()
  • RegExp.prototype[Symbol.matchAll]()
  • RegExp.prototype[Symbol.replace]()
  • RegExp.prototype[Symbol.search]()
  • RegExp.prototype[Symbol.split]()
  • RegExp.prototype.exec()
  • RegExp.prototype.test()
  • Symbol.match

© 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/Global_Objects/RegExp/Symbol.match

Spec-Zone.ru

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