Что на самом деле меняют флаги
| Флаг | Действие | Когда нужен |
| --- | --- | --- |
| g | Искать все совпадения, а не первое | Почти всегда при отладке |
| i | Без учёта регистра | Пользовательский ввод, домены, ключевые слова |
| m | ^ и $ работают на каждой строке | Построчный текст, разбор логов |
| s | . захватывает и перенос строки | Совпадение через многострочный блок |
| u | Режим Unicode | \d, \w и \p{...} за пределами ASCII; обязателен для \p{L} |
Чаще всего забывают именно u. Без него \d совпадает только с 0-9, а \w —
только с ASCII: для машинного формата нормально, но неверно ровно в тот момент,
когда человек вводит своё имя.
Как пользоваться
- Наберите шаблон между слэшами. Флаги — кнопки рядом.
- Слева вставьте текст, по которому идёт поиск.
- Справа совпадения подсвечиваются, а таблица ниже перечисляет каждое с позицией и группами захвата.
Коротко о катастрофическом бэктрекинге
Шаблон вида (a+)+$ на длинной строке из символов a может работать
экспоненциальное время: движок перебирает все способы разбить вход, прежде чем
сдаться. На сервере, где шаблон применяется к пользовательскому вводу, это
настоящий вектор отказа в обслуживании. Признак — вложенные квантификаторы над
пересекающимися вариантами. Если шаблон подвешивает предпросмотр здесь, не
выпускайте его: перепишите так, чтобы каждый символ поглощался единственным способом.
Вопросы
Какой это диалект регулярных выражений?+
JavaScript — потому что шаблон исполняет собственный движок RegExp вашего браузера. Это важно: в JavaScript нет possessive-квантификаторов, в старых Safari нет lookbehind, а \d без флага u совпадает только с ASCII-цифрами. Шаблон, работающий здесь, будет работать в Node и в браузере, но не обязательно в PCRE, Python или Go.
Почему поиск остановился на 500 совпадениях?+
Это намеренное ограничение. Широкий шаблон на длинном тексте может дать десятки тысяч совпадений, и отрисовка всех подвесит вкладку. Строка состояния сообщает, что список обрезан; лучше уточнить шаблон, чем поднимать лимит.
Что происходит с совпадением нулевой длины?+
Шаблоны вроде a*, \b или пустой группы совпадают, не поглощая символ, из-за чего наивный цикл крутится вечно. Этот инструмент сдвигается на позицию вперёд после каждого пустого совпадения, поэтому вы видите по одному результату на позицию, а страница остаётся отзывчивой.
Поддерживаются ли именованные группы?+
Да, (?<name>...) работает, и в колонке групп выводится имя=значение, а не порядковый номер. Именованные группы стоят лишних символов: они переживают вставку чужой группы перед вашей.