Именованная захватывающая группа: (?<name>...)
Базовая линия Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Именованная захватывающая группа — это особый вид захватывающей группы, который позволяет присвоить группе имя. Результат соответствия группы затем можно будет идентифицировать по этому имени, а не по ее индексу в шаблоне.
Синтаксис
(?<name>pattern)
Параметры
-
pattern - Шаблон, состоящий из чего угодно, что вы можете использовать в литерале регулярного выражения, включая дизъюнкцию.
-
name - Имя группы. Должно быть допустимым идентификатором.
Описание
Именованные захватывающие группы можно использовать так же, как и обычные захватывающие группы — они также имеют свой индекс соответствия в результирующем массиве и могут быть доступны через \1, \2 и т. д. Единственное отличие заключается в том, что к ним можно *дополнительно* обращаться по их имени. Информацию о соответствии захватывающей группы можно получить через:
- Свойство
groupsвозвращаемого значения методовRegExp.prototype.exec(),String.prototype.match()иString.prototype.matchAll() - Параметр
groupsфункции обратного вызоваreplacementметодовString.prototype.replace()иString.prototype.replaceAll() - Именованные обратные ссылки внутри того же шаблона
Все имена должны быть уникальными в пределах одного шаблона. Несколько именованных захватывающих групп с одним и тем же именем приводят к синтаксической ошибке.
/(?<name>)(?<name>)/; // SyntaxError: Invalid regular expression: Duplicate capture group name
Это ограничение снимается, если дублирующиеся именованные захватывающие группы находятся не в одной альтернативе дизъюнкции, поэтому для любого входного строкового значения может быть фактически сопоставлена только одна именованная захватывающая группа. Это гораздо более новая функция, поэтому проверьте совместимость с браузерами перед ее использованием.
/(?<year>\d{4})-\d{2}|\d{2}-(?<year>\d{4})/;
// Works; "year" can either come before or after the hyphen
Именованные захватывающие группы будут присутствовать в результате. Если именованная захватывающая группа не совпала (например, она принадлежит несоответствующей альтернативе в дизъюнкции), соответствующее свойство объекта groups будет иметь значение undefined.
/(?<ab>ab)|(?<cd>cd)/.exec("cd").groups; // [Object: null prototype] { ab: undefined, cd: 'cd' }
Вы можете получить начальные и конечные индексы каждой именованной захватывающей группы во входной строке, используя флаг d. Помимо доступа к ним через свойство indices массива, возвращаемого exec(), вы также можете получить доступ к ним по их именам в indices.groups.
По сравнению с безымянными захватывающими группами, именованные захватывающие группы имеют следующие преимущества:
- Они позволяют присвоить описательное имя каждому подсовпадению.
- Они позволяют получать доступ к результатам подсовпадений без необходимости запоминать порядок их появления в шаблоне.
- При рефакторинге кода вы можете изменять порядок захватывающих групп, не опасаясь нарушить другие ссылки.
Примеры
Использование именованных захватывающих групп
Следующий пример разбирает временную метку и имя автора из записи лога Git (вывод с git log --format=%ct,%an -- filename):
function parseLog(entry) {
const { author, timestamp } = /^(?<timestamp>\d+),(?<author>.+)$/.exec(
entry,
).groups;
return `${author} committed on ${new Date(
parseInt(timestamp, 10) * 1000,
).toLocaleString()}`;
}
parseLog("1560979912,Caroline"); // "Caroline committed on 6/19/2019, 5:31:52 PM"
Спецификации
| Спецификация |
|---|
| ECMAScript® 2027 Language Specification # prod-Atom |
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | |
named_capturing_group |
64 |
79 |
78 |
51 |
11.1 |
64 |
79 |
47 |
11.3 |
9.0 |
64 |
11.3 |
1.0.0 |
1.0 |
10.0.0 |
duplicate_named_capturing_groups |
125 |
125 |
129 |
111 |
17 |
125 |
129 |
83 |
17 |
27.0 |
125 |
17 |
1.0.0 |
1.44 |
23.0.0 |
См. также
- Polyfill именованных захватывающих групп в
core-js - Руководство по группам и обратным ссылкам
- Регулярные выражения
- Захватывающая группа:
(...) - Незахватывающая группа:
(?:...) - Именованная обратная ссылка:
\k<name> - Правило ESLint:
prefer-named-capture-group
© 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/Named_capturing_group