Как пользоваться тестером регулярных выражений
Регулярное выражение (regex) — компактный синтаксис для описания правил сопоставления текста. Он используется везде: валидация форм, извлечение из логов, массовая замена, очистка данных. Но regex плотен: одна неверная буква — и смысл меняется полностью. Инструмент, который показывает совпадения прямо во время набора, экономит массу времени.
Что даёт этот инструмент
- Подсветка в реальном времени: пока вы набираете шаблон, каждое совпадение в тестовом тексте отмечается — ни одной кнопки нажимать не нужно
- Список совпадений: каждый найденный фрагмент текста и его позиция перечислены отдельно, удобно сверять
- Группы захвата: подстроки, захваченные скобками, подсвечиваются разными цветами, так что можно проверить, соответствует ли группировка задуманному
- Сообщения об ошибках: при неверном синтаксисе сообщается, какого рода ошибка (например, незакрытая скобка), а не молчаливый сбой
- Шпаргалка: нажмите на частое шаблон (телефон, e-mail, номер удостоверения и т. д.), чтобы вставить его — не нужно писать и запоминать
Что означают пять распространённых флагов
gglobal: находить все совпадения, а не останавливаться на первом. При тестировании удобно держать включённым.iигнорировать регистр:/abc/iнаходитABCиAbc.mмногострочный: заставляет^и$соответствовать началу и концу каждой строки, а не всего текста. Необходим для построчной валидации.sточка соответствует переводу строки: по умолчанию.не соответствует переводу строки; с этим флагом.соответствует любому символу, включая переводы строк.uрежим Unicode: корректно обрабатывает четырёхбайтовые символы — эмодзи и редкие иероглифы. Если в тестовом тексте есть эмодзи, а результаты выглядят неверно, попробуйте включить этот флаг.
Несколько ловушек, в которые попадают
Жадные квантификаторы. .* по умолчанию жаден и захватывает максимум. Сопоставление <a><b> с <.*> вернёт всю строку, а не два тега. Замените на <.*?> (знак вопроса делает его ленивым) — и получите нужное поведение.
Якоря и многострочность. В обычном режиме ^\d+$ совпадает, только когда весь текст — одно число. Для построчной валидации нужно включить m.
Забыли экранирование. Писать regex внутри строки JavaScript означает удваивать обратные слэши — шаблон телефона превращается в "^1[3-9]\\d{9}$". Поле ввода здесь принимает литерал regex, поэтому одиночный обратный слэш, как в \d, — правильно.
Валидация формы требует якорей. Записав просто [0-9]{11}, вы найдёте «телефон» и внутри abc13800000000xyz. Для валидации нужно ограничить его с ^...$ от начала до конца.
Замечание о производительности
Некоторые шаблоны вызывают катастрофический откат. Например, (a+)+b на длинной последовательности aaaa... может работать экспоненциально дольше и подвесить браузер. Если страница перестала отвечать, виноваты обычно вложенные квантификаторы — перепишите шаблон точнее, например как a+b.
Частые вопросы
Можно ли использовать шаблоны из шпаргалки в продакшене?
Да, но корректируйте по необходимости. Правило для телефонного номера меняется вместе с политикой нумерации и требует обновления при выдаче новых префиксов. Полный шаблон номера удостоверения проверяет только формат и правдоподобность даты — он не проверяет последнюю контрольную цифру. А e-mail — практичное упрощение, покрывающее подавляющее большинство случаев; строго соответствующий RFC 5322 шаблон куда сложнее и обычно не стоит того.
Почему мой regex работает в другом языке, а здесь нет?
Этот инструмент использует движок регулярных выражений JavaScript, чей синтаксис отличается от PCRE (PHP, Python-модуль re). Три типичных отличия: в JavaScript нет части расширенного синтаксиса помимо (?<name>), нет условий и рекурсии, нет якорей \A / \z (используйте ^ и $). Именованные группы (?<name>...) поддерживаются.
Как искать содержимое, охватывающее переводы строк?
Двумя способами: замените . на [\s\S] или включите флаг s. Первый вариант переносимее и работает практически в любом движке.
Сохраняется ли тестовый текст?
Нет. Всё сопоставление идёт в памяти браузера и очищается при перезагрузке страницы. Ничего не отправляется.