Spec-Zone.ru › JavaScript

Именованная захватывающая группа: (?<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

Spec-Zone.ru

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