Захватывающая группа: (...)
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 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']
В примере выше внешняя группа совпадает трижды:
- Совпадает
"aac", с подгруппами"aa",undefined, и"c". - Совпадает
"bbbc", с подгруппамиundefined,"bbb", и"c". - Совпадает
"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