Spec-Zone.ru › JavaScript

Незахватывающая группа: (?:...)

Базовая линия Широко доступно

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

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

Синтаксис

(?:pattern)

Параметры

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

Примеры

Группировка подшаблона и применение квантификатора

В следующем примере мы проверяем, заканчивается ли путь к файлу на styles.css или styles.[a hex hash].css. Поскольку вся часть \.[\da-f]+ является необязательной, чтобы применить к ней квантификатор ?, нам нужно сгруппировать ее в новый атом. Использование незахватывающей группы улучшает производительность, не создавая дополнительную информацию о совпадении, которая нам не нужна.

function isStylesheet(path) {
  return /styles(?:\.[\da-f]+)?\.css$/.test(path);
}

isStylesheet("styles.css"); // true
isStylesheet("styles.1234.css"); // true
isStylesheet("styles.cafe.css"); // true
isStylesheet("styles.1234.min.css"); // false

Группировка дизъюнкции

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

function isImage(filename) {
  return /\.(?:png|jpe?g|webp|avif|gif)$/i.test(filename);
}

isImage("image.png"); // true
isImage("image.jpg"); // true
isImage("image.pdf"); // false

Избежание опасностей рефакторинга

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

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

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

parseTitle('title="foo"'); // 'foo'

Если позже мы решим добавить name='xxx' как псевдоним для title=, нам нужно будет сгруппировать дизъюнкцию в другую группу:

function parseTitle(metastring) {
  // Oops — the backreference and index access are now off by one!
  return metastring.match(/(title|name)=(["'])(.*?)\1/)[2];
}

parseTitle('name="foo"'); // Cannot read properties of null (reading '2')
// Because \1 now refers to the "name" string, which isn't found at the end.

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

function parseTitle(metastring) {
  // Do not capture the title|name disjunction
  // because we don't use its value
  return metastring.match(/(?:title|name)=(["'])(.*?)\1/)[2];
}

parseTitle('name="foo"'); // 'foo'

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

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

Спецификация
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
non_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>...)

© 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/Non-capturing_group

Spec-Zone.ru

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