«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
andre.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