Spec-Zone.ru › JavaScript

Модификатор: (?ims-ims:...)

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

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

Модификатор переопределяет настройки флагов в определенной части регулярного выражения. Он может использоваться для включения или отключения флагов, изменяющих значения определенных элементов синтаксиса регулярных выражений. Этими флагами являются i, m и s.

Синтаксис

(?flags1:pattern)
(?flags1-flags2:pattern)

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

Параметры

flags1 Необязательно
Строка флагов для включения. Может содержать любую комбинацию i, m и s.
flags2 Необязательно
Строка флагов для отключения. Может содержать любую комбинацию i, m и s, но не должна содержать никаких флагов, включенных в flags1.
pattern
Шаблон, состоящий из всего, что вы можете использовать в литерале регулярного выражения, включая дизъюнкцию.

Описание

Некоторые флаги изменяют значения элементов синтаксиса регулярных выражений:

  • Флаг i делает регулярное выражение нечувствительным к регистру, делая все буквенные символы и классы символов неявно строчными.
  • Флаг m изменяет поведение утверждений границ ввода ^ и $, чтобы они соответствовали началу и концу каждой строки, в дополнение к началу и концу входной строки.
  • Флаг s изменяет поведение шаблонного символа ., чтобы он соответствовал любому символу, включая терминаторы строк.

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

/(?i:Hello) world/;

В этом регулярном выражении флаг i включен только для части Hello шаблона. Часть world чувствительна к регистру. Поэтому она соответствует Hello world, hello world и HELLO world, но не HELLO WORLD. Следующий пример эквивалентен, путем глобального включения флага i, а затем его отключения для части world:

/Hello (?-i:world)/i;

Параметры flags1 и flags2 могут содержать любую комбинацию i, m и s. Однако флаги должны быть уникальны между flags1 и flags2 — вы не можете включить или отключить флаг дважды, или включить флаг, а затем немедленно отключить его.

Параметры flags1 и flags2 являются необязательными, но хотя бы один из них должен быть непустым. (?flags1-:pattern) — это модификатор, который только включает флаги (эквивалентно (?flags1:pattern)). (?-flags2:pattern) — это модификатор, который только отключает флаги. (?:pattern) — это просто незахватывающая группа, а (?-:pattern) — синтаксическая ошибка.

Другие флаги не имеют смысла в модификаторе и поэтому являются синтаксическими ошибками, если они включены:

  • Флаги g и y определяют, как ведут себя множественные вызовы exec() и влияют на поведение всего регулярного выражения.
  • Флаг d включает дополнительную информацию в результат exec() и влияет на поведение всего регулярного выражения.
  • Флаги u и v изменяют поведение движка регулярных выражений таким образом, что это слишком сложно для локального изменения. Они также оказывают глобальное влияние на регулярное выражение, например, как продвигается lastIndex.

Примеры

Сопоставление многострочного формата только в начале строки

Следующее регулярное выражение определяет формат для многострочной строки. Первый ^ представляет начало всей входной строки, находясь внутри модификатора (?-m:), в то время как все остальные символы ^ представляют начало строки:

const pattern = /(?-m:^)---\n^title:.*^slug:.*^---/ms;

const input = `---
title: "Modifier: (?ims-ims:...)"
slug: Web/JavaScript/Reference/Regular_expressions/Modifier
---`;

pattern.test(input); // true

// Extra line break at the start of string
const input2 = `\n${input}`;

pattern.test(input2); // false

Сопоставление определенных слов без учета регистра

Представьте, что вы ищете все объявления переменных с именем foo или bar (поскольку это плохие имена). Слово может встречаться в любом регистре, но вы знаете, что ключевое слово всегда пишется в нижнем регистре, поэтому вы можете сделать следующее:

const pattern = /(?:var|let|const) (?i:foo|bar)\b/;

pattern.test("let foo;"); // true
pattern.test("const BAR = 1;"); // true
pattern.test("Let foo be a number"); // false

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

Спецификация
Спецификация языка ECMAScript® 2027
# prod-RegularExpressionModifiers

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

Настольные Мобильные Серверные
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
modifier
125
125
132
111
26
125
132
83
26
27.0
125
26
1.2.3
1.44
23.0.0

См. также

  • Руководство по группам и обратным ссылкам
  • Регулярные выражения
  • Незахватывающая группа: (?:...)

© 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/Modifier

Spec-Zone.ru

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