Пишите регулярное выражение — совпадения подсвечиваются в реальном времени, каждый токен паттерна разбирается ниже. Плюс справочник готовых выражений для email, телефонов, дат, IP и других частых случаев.
Регулярные выражения — язык для поиска и замены по шаблону. В JavaScript используется свой диалект (PCRE-inspired). Ключевые части: якоря (^ $ \b), классы (\d \w \s . [ ]), квантификаторы (* + ? {n,m}), группы (( ) (?: )), альтернатива (|).
Флаги
gimsuy
g · глобально · i · регистр · m · строки
g — искать все совпадения, а не только первое. i — регистронезависимо. m — ^ и $ работают на каждой строке отдельно. s — точка совпадает с \n. u — Unicode. y — sticky (только с позиции lastIndex). Флаги комбинируются: /.../gim.
Жадные vs ленивые
Backtracking
.* — жадно · .*? — лениво
Квантификаторы по умолчанию жадные — забирают максимум. Добавьте ? — станут ленивыми, возьмут минимум. Классический пример: .* в /<.*>/ на «<a><b>» захватит «<a><b>», а .*? — только «<a>». Для парсинга HTML лучше использовать специальные парсеры.
Осторожно с производительностью
ReDoS
(a+)+ на «aaaaX» — экспоненциальное время
Некоторые паттерны могут висеть на миллионах итераций backtracking (ReDoS-атака). Опасны вложенные квантификаторы вроде (a+)+ или (a|a)*. Пишите атомарные шаблоны, тестируйте на длинных входах. В критичных местах — RE2 (Go, Google), который не имеет backtracking.
05
Частые вопросы
Введите шаблон и тестовый текст — совпадения подсветятся сразу, по мере набора, а рядом появится их список и счётчик. Ошибка в шаблоне не ломает страницу: вместо подсветки выводится сообщение движка о том, что именно ему не понравилось. Ниже шаблон разбирается на токены с пояснением каждого.
`\d` — любая цифра, `\w` — буква, цифра или подчёркивание, `\s` — пробельный символ, включая табуляцию и перенос строки. Заглавный вариант означает отрицание: `\D` — всё, кроме цифры. Важная тонкость: в JavaScript `\w` охватывает только латиницу, поэтому для кириллицы нужен явный диапазон вроде `[а-яё]`.
Объёмом захвата. Жадный `.*` берёт самый длинный подходящий кусок, ленивый `.*?` — самый короткий. На строке `<b>раз</b> <b>два</b>` шаблон `<b>.*</b>` захватит всё от первого тега до последнего, а `<b>.*?</b>` — только первую пару с содержимым. Это самая частая причина неожиданного результата.
Включите флаг `g`, иначе найдётся только первое совпадение, и возьмите шаблон вроде `[\w.+-]+@[\w-]+\.[\w.]+`. Полностью корректная проверка адреса по стандарту регулярным выражением практически нереализуема, но для вытаскивания адресов из текста этого достаточно — в каталоге примеров такой шаблон есть, его можно подставить одним нажатием.
`g` — искать все совпадения, а не только первое. `i` — не различать регистр. `m` — многострочный режим, в котором `^` и `$` совпадают с началом и концом каждой строки, а не всего текста. `s` — режим, в котором точка начинает совпадать и с переносом строки. Эти четыре флага переключаются кнопками у поля шаблона.
Нет. Выражение выполняет движок регулярных выражений вашего браузера, шаблон и тестовый текст никуда не передаются. Отсюда же важное ограничение: диалект здесь javascriptовый, и при переносе шаблона в PHP, Python или Go синтаксис местами разойдётся — особенно в просмотрах назад и именованных группах.