Spec-Zone.ru › JavaScript

Захватывающая группа: (...)

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

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

Захватывающая группа группирует подшаблон, позволяя применить квантификатор ко всей группе или использовать внутри нее дизъюнкции. Она запоминает информацию о совпадении подшаблона, чтобы вы могли сослаться на него позже с помощью обратной ссылки или получить доступ к информации через результаты совпадения.

Если вам не нужен результат совпадения подшаблона, используйте вместо этого незахватывающую группу, что повышает производительность и предотвращает риски при рефакторинге.

Синтаксис

(pattern)

Параметры

pattern
Шаблон, состоящий из всего, что вы можете использовать в регулярном выражении, включая дизъюнкцию.

Описание

Захватывающая группа действует как оператор группировки в выражениях JavaScript, позволяя вам использовать подшаблон как единый атом.

Захватывающие группы нумеруются в порядке их открывающих скобок. Первая захватывающая группа нумеруется 1, вторая 2 и так далее. Именованные захватывающие группы также являются захватывающими группами и нумеруются вместе с другими (безымянными) захватывающими группами. Доступ к информации о совпадении захватывающей группы можно получить через:

  • Возвращаемое значение (которое является массивом) RegExp.prototype.exec(), String.prototype.match(), и String.prototype.matchAll()
  • Параметры pN функции обратного вызова replacement методов String.prototype.replace() и String.prototype.replaceAll()
  • Обратные ссылки в пределах того же шаблона

Примечание: Даже в массиве результатов exec() доступ к захватывающим группам осуществляется по номерам 1, 2 и т.д., поскольку элемент 0 — это всё совпадение целиком. \0 — это не обратная ссылка, а экранированный символ для символа NUL.

Захватывающие группы в исходном коде регулярного выражения соответствуют их результатам один к одному. Если захватывающая группа не совпала (например, она относится к несовпавшей альтернативе в дизъюнкции), соответствующий результат — undefined.

/(ab)|(cd)/.exec("cd"); // ['cd', undefined, 'cd']

К захватывающим группам можно применить квантификатор. В этом случае информация о совпадении, соответствующая этой группе, является последним совпадением группы.

/([ab])+/.exec("abc"); // ['ab', 'b']; because "b" comes after "a", this result overwrites the previous one

Захватывающие группы могут использоваться в утверждениях предпросмотра и ретроспективного просмотра. Поскольку утверждения ретроспективного просмотра сопоставляют свои атомы в обратном порядке, конечное совпадение, соответствующее этой группе, — это то, которое находится на левом конце строки. Однако индексы групп совпадений по-прежнему соответствуют их относительному расположению в источнике регулярного выражения.

/c(?=(ab))/.exec("cab"); // ['c', 'ab']
/(?<=(a)(b))c/.exec("abc"); // ['c', 'a', 'b']
/(?<=([ab])+)c/.exec("abc"); // ['c', 'a']; because "a" is seen by the lookbehind after the lookbehind has seen "b"

Захватывающие группы могут быть вложенными, и в этом случае внешняя группа нумеруется первой, а затем внутренняя, поскольку они упорядочены по открывающим скобкам. Если вложенная группа повторяется квантификатором, то при каждом совпадении группы результаты подгрупп перезаписываются, иногда значением undefined.

/((a+)?(b+)?(c))*/.exec("aacbbbcac"); // ['aacbbbcac', 'ac', 'a', undefined, 'c']

В примере выше внешняя группа совпадает трижды:

  1. Совпадает "aac", с подгруппами "aa", undefined, и "c".
  2. Совпадает "bbbc", с подгруппами undefined, "bbb", и "c".
  3. Совпадает "ac", с подгруппами "a", undefined, и "c".

Результат "bbb" из второго совпадения не сохраняется, потому что третье совпадение перезаписывает его значением undefined.

Вы можете получить начальные и конечные индексы каждой захватывающей группы во входной строке, используя флаг d. Это создает дополнительное свойство indices в массиве, возвращаемом exec().

Вы можете опционально указать имя захватывающей группе, что помогает избежать проблем, связанных с позициями групп и индексацией. См. Именованные захватывающие группы для получения дополнительной информации.

Круглые скобки имеют другие цели в различных синтаксисах регулярных выражений. Например, они также заключают утверждения предпросмотра и ретроспективного просмотра. Поскольку все эти синтаксисы начинаются с ?, а ? — это квантификатор, который обычно не может находиться непосредственно после (, это не приводит к неоднозначности.

Примеры

Сопоставление даты

Следующий пример сопоставляет дату в формате YYYY-MM-DD:

function parseDate(input) {
  const parts = /^(\d{4})-(\d{2})-(\d{2})$/.exec(input);
  if (!parts) {
    return null;
  }
  return parts.slice(1).map((p) => parseInt(p, 10));
}

parseDate("2019-01-01"); // [2019, 1, 1]
parseDate("2019-06-19"); // [2019, 6, 19]

Сопоставление кавычек

Следующая функция сопоставляет шаблоны title='xxx' и title="xxx" в строке. Чтобы гарантировать совпадение кавычек, мы используем обратную ссылку для обращения к первой кавычке. Доступ ко второй захватывающей группе ([2]) возвращает строку между сопоставленными символами кавычек:

function parseTitle(metastring) {
  return metastring.match(/title=(["'])(.*?)\1/)[2];
}

parseTitle('title="foo"'); // 'foo'
parseTitle("title='foo' lang='en'"); // 'foo'
parseTitle('title="Named capturing groups\' advantages"'); // "Named capturing groups' advantages"

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

Спецификация
ECMAScript® 2027 Language Specification
# prod-Atom

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

Десктопные Мобильные Серверные
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
capturing_group
1
12
1
5
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • Руководство по группам и обратным ссылкам
  • Регулярные выражения
  • Незахватывающая группа: (?:...)
  • Именованная захватывающая группа: (?<name>...)
  • Обратная ссылка: \1, \2

© 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/Regular_expressions/Capturing_group

Spec-Zone.ru

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