JavaScript | Флаги регулярных выражений

«g», «i», «m», «s», «u», «y»

«g» — «global»

Глобально сопоставить шаблон несколько раз в строке.

Определяет, надо ли проверять регулярное выражение на все возможные сопоставления со строкой, или достаточно только первый раз.

code unit 0x0067 (LATIN SMALL LETTER G)

 

«i» — «ignoreCase»

Определяет, надо ли игнорировать регистр символов при попытке сопоставления со строкой.

Сопоставление с образцом без учета регистра. Например, «A» будет соответствовать «a» под /i.

Если действуют правила сопоставления языковых стандартов, карта регистра берется из текущего языкового стандарта для кодовых точек меньше 255 и из правил Юникода для более крупных кодовых точек. Однако совпадения, которые пересекают границу правил Unicode / правил не-Unicode (порядки 255/256), не будут успешными, если локаль не является UTF-8. Смотрите perllocale.

Существует ряд символов Unicode, которые соответствуют последовательности из нескольких символов в /i

code unit 0x0069 (LATIN SMALL LETTER I)

 

«m» — «multiline»

Определяет, надо ли искать по нескольким строкам.

code unit 0x006D (LATIN SMALL LETTER M)

 

«s» — «dotAll»

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

  • . не соответствует астральным символам. Установка флага u (unicode) исправляет это.
  • . не соответствует символам конца строки.

ECMAScript распознает следующие символы конца строки:

  • U+000A LINE FEED (LF) (\n)
  • U+000D CARRIAGE RETURN (CR) (\r)
  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

Однако есть и другие символы, которые, в зависимости от варианта использования, можно рассматривать как символы новой строки:

  • U+000B VERTICAL TAB (\v)
  • U+000C FORM FEED (\f)
  • U+0085 NEXT LINE

Это делает текущее поведение . проблематично:

  • По дизайну он исключает некоторые символы новой строки, но не все из них, что часто не соответствует сценарию использования разработчика.
  • Обычно он используется для сопоставления любого символа, чего не делает.

Предложение, которое вы сейчас рассматриваете, решает последнюю проблему.

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

/foo.bar/.test('foo\nbar');
// → false

Вместо этого разработчикам приходится прибегать к загадочным обходным путям вроде [\s \S] или [^]:

/foo[^]bar/.test('foo\nbar');
// → true

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

1 — Механизмы, поддерживающие константы для включения флагов регулярных выражений, реализуют модификаторы DOTALL или SINGLELINE / s.

  • Java supports Pattern.DOTALL.
  • C# and VB support RegexOptions.Singleline.
  • Python supports both re.DOTALL and re.S.

2 — Механизмы, поддерживающие встроенные выражения флагов, реализуют (?s).

3 — Механизмы, поддерживающие флаги регулярных выражений, реализуют флаг s.

Обратите внимание на установившуюся традицию именования этих модификаторов s (сокращение от singleline) и dotAll.

Единственным исключением является Ruby, где флаг m (Regexp :: MULTILINE) также включает режим dotAll. К сожалению, мы не можем сделать то же самое для флага m в JavaScript без нарушения обратной совместимости.

Предложенное решение

Мы предлагаем добавить новый флаг s для регулярных выражений ECMAScript, которые делают . соответствует любому символу, включая терминаторы строки.

/foo.bar/s.test('foo\nbar');
// → true

API высокого уровня

const re = /foo.bar/s; // Or, `const re = new RegExp('foo.bar', 's');`.
re.test('foo\nbar');
// → true
re.dotAll
// → true
re.flags
// → 's'

А как насчет обратной совместимости?

Смысл существующих шаблонов регулярных выражений не затрагивается этим предложением, так как новый флаг s необходим для включения нового поведения.

Как режим dotAll влияет на многострочный режим?

Этот вопрос может возникнуть, поскольку флаг s означает singleline (однострочность), что, кажется, противоречит m / multiline, но это не так. Это немного прискорбно, но мы просто следуем установившейся традиции именования в других механизмах регулярных выражений. Выбор любого другого имени флага только вызовет большую путаницу. Имя средства доступа dotAll дает гораздо лучшее описание эффекта флага. По этой причине мы рекомендуем называть этот режим режимом dotAll, а не singleline (однострочным).

Оба режима независимы и могут комбинироваться. multiline (многострочный) режим влияет только на привязки, а режим dotAll влияет только на . .

Если установлены оба флага s (dotAll) и m (multiline),, то . соответствует любому символу, при этом позволяя совпадать ^ и $, соответственно, сразу после и непосредственно перед разделителями строки в строке.

code unit 0x0073 (LATIN SMALL LETTER S)

 

«u» — «unicode»

Устанавливает набор символов в Unicode.

Означает использование правил Unicode при сопоставлении с образцом. На платформах ASCII это означает, что кодовые точки между 128 и 255 принимают значение Latin-1 (ISO-8859-1) (то же самое, что и Unicode). (В противном случае Perl считает их значения неопределенными.) Таким образом, согласно этому модификатору, платформа ASCII фактически становится платформой Unicode; и, следовательно, например, \w будет соответствовать любому из более чем 100_000 символов слова в Unicode.

code unit 0x0075 (LATIN SMALL LETTER U)

 

«y» — «sticky»

Определяет, включён ли режим «липкого» поиска.

code unit 0x0079 (LATIN SMALL LETTER Y)

 

Информационные ссылки

https://github.com/tc39/proposal-regexp-dotall-flag

 

Поделись записью