belun.app Блог EN

Регулярные выражения: шаблоны, флаги и практические примеры

Как работают регулярные выражения в JavaScript: флаги, классы символов, якоря и готовые шаблоны для email, URL и телефонных номеров.

developer testing regular expressions in a dark code editor terminal on screen

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

Когда regex оправдывает себя

Regex имеет смысл, когда у искомого есть внутренняя структура: email-адрес, номер версии, дата в конкретном формате, строка в лог-файле, начинающаяся с временной метки.

Для простого поиска подстроки используйте includes(). Для «похоже ли это на телефонный номер» — regex. Время на написание шаблона окупается, когда простые строковые методы потребовали бы пяти строк логики.

Четыре флага, которые стоит знать

g — глобальный. Без него движок находит первое совпадение и останавливается. С ним вы получаете все.

i — без учёта регистра. /ошибка/i найдёт «Ошибка», «ОШИБКА» и «ошибка».

m — многострочный. По умолчанию ^ и $ совпадают с началом и концом всей строки целиком. С флагом m они совпадают с началом и концом каждой строки. Это сбивает с толку многих.

s — dotAll. Точка . по умолчанию не совпадает с переводом строки. С флагом s — совпадает, что удобно, когда контент занимает несколько строк.

Флаги можно комбинировать: gi, gim, gis.

Шаблоны, которые встречаются постоянно

Вот несколько, которые стоит сохранить:

Email (достаточно для большинства случаев)
[\w.+-]+@[\w-]+\.[a-z]{2,}

Все целые числа в строке
\d+

Слова, начинающиеся с заглавной буквы
\b[A-Z][a-z]+\b

Дата в формате ISO (ГГГГ-ММ-ДД)
\d{4}-\d{2}-\d{2}

URL
https?://[\w./%-?=&#]+

Ни один из них не идеален. Шаблон для email не обрабатывает все граничные случаи — но читаемый шаблон с точностью 99% лучше, чем 200-символьный монстр, соответствующий RFC, который невозможно отладить при первой же проблеме.

Три ошибки, на которых спотыкаются все

Забыть экранировать специальные символы. Точка . в regex означает «любой символ». /3.14/ также совпадёт с 3x14. Буквальная точка пишется как \..

Использовать ^ и $ в многострочном тексте без флага m. В итоге ничего не находится и непонятно почему.

Вложенные квантификаторы с чередованием. (a|ab)+ на длинной строке, которая не совпадает, может вызвать катастрофический возврат и заморозить поток. Если в шаблоне есть вложенные группы с квантификаторами — проверяйте его на длинных входных данных, прежде чем отдавать в продакшен.

Именованные группы захвата

В JavaScript именованные группы появились в ES2018. Синтаксис: (?<name>шаблон):

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

Примените к строке «2026-05-27» — и получите match.groups.year === "2026" вместо того, чтобы вспоминать, какой индекс за что отвечает. Читать такой код через полгода значительно проще.

Как использовать тестер

Вставьте шаблон в тестер регулярных выражений — только сам шаблон, без окружающих косых черт. Добавьте нужные флаги в поле после второй косой черты. Вставьте тестовый текст в область ниже.

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

Всё работает в браузере — ваши данные никуда не отправляются.

Попробуйте инструмент

Тестер регулярных выражений →