
Регулярные выражения: как читать и составлять
Регулярное выражение вроде ^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$ выглядит как
случайный набор символов, пока не знаешь, что каждый символ в нём отдельная
команда с чётким смыслом. Разберём алфавит regex по токенам, а дальше в этой же
статье стоит живой тестер, чтобы сразу проверить свой
пример, не открывая другую вкладку.
Из чего состоит регулярное выражение
Регулярное выражение читается слева направо, токен за токеном, так же, как компьютер его и разбирает.
| Токен | Значение |
|---|---|
. |
любой символ, кроме переноса строки |
\d |
цифра (0-9) |
\D |
не цифра |
\w |
«словесный» символ: буква, цифра, _ |
\s |
пробельный символ (пробел, таб, перенос строки) |
[abc] |
один символ из перечисленных — a, b или c |
[^abc] |
один символ, кроме перечисленных |
[a-z] |
диапазон — любая строчная латинская буква |
^ |
начало строки |
$ |
конец строки |
(...) |
группа — захватывает совпавший фрагмент |
(?:...) |
группа без захвата — только группирует, не запоминает |
a|b |
«или» — совпадает a либо b |
Квантификаторы отвечают на вопрос «сколько раз» и всегда стоят сразу после символа или группы, к которой относятся:
| Квантификатор | Значение |
|---|---|
* |
0 или больше раз |
+ |
1 или больше раз |
? |
0 или 1 раз (необязательный элемент) |
{3} |
ровно 3 раза |
{2,5} |
от 2 до 5 раз |
{2,} |
2 или больше раз |
Собираем: \d{3}-\d{2}-\d{2} читается как «три цифры, дефис, две цифры, дефис,
две цифры» и совпадёт с 123-45-67.
Живой regex-тестер
Впишите свой паттерн и тестовую строку, совпадения подсветятся сразу, без перезагрузки страницы:
Живой regex-тестер
Поставьте курсор в поле паттерна и попробуйте \d{3}-\d{2}-\d{2} вместо \d+.
Подсветится только номер телефона целиком, а не отдельные цифры даты.
Жадные и ленивые квантификаторы
Это самое частое место, где регулярка «сработала не так».
По умолчанию квантификаторы жадные, они забирают максимум возможного:
Жадный .+ не останавливается на первой попавшейся >. Он пытается забрать как
можно больше символов, а потом «сдаёт назад» ровно настолько, чтобы совпадение
всё ещё нашлось. Добавьте ? сразу после квантификатора, чтобы сделать его
ленивым, и он остановится при первой возможности:
Правило простое. Нужен самый короткий фрагмент между двумя разделителями, берите
ленивый квантификатор (*?, +?, ??). Нужен самый длинный, оставляйте жадный
по умолчанию.
Флаги
Флаги пишутся после закрывающего слэша и меняют поведение всего выражения:
| Флаг | Что делает |
|---|---|
g |
глобальный поиск — находит все совпадения, а не только первое |
i |
без учёта регистра |
m |
многострочный режим — ^/$ работают на границах каждой строки, а не только всей строки |
s |
. дополнительно совпадает с переносом строки |
u |
режим Unicode — корректная работа с символами вне базовой таблицы (эмодзи, некоторые иероглифы) |
Без g String.prototype.match() вернёт только первое совпадение и
остановится. Это частая причина, почему «регулярка вроде рабочая, а находит
только один результат».
Готовые паттерны
Выражения, которые пригождаются чаще всего. На экзотических случаях они не идеальны (RFC для email длиннее любой статьи), но покрывают подавляющее большинство реальных данных:
Вставьте любой из них в тестер выше (без /^.../$, только то, что между
слэшами) и проверьте на своих данных.
Частые ошибки при чтении regex
Забыли экранировать спецсимвол. Точка . в regex значит «любой символ», а не
буквальную точку. Чтобы найти именно точку, экранируйте её: \.. То же с +,
*, ?, (, ), [, ], все они спецсимволы, и для буквального совпадения
нужен обратный слэш перед ними.
Забыли ^ и $. Без них выражение ищет совпадение где угодно в строке, а не
проверяет строку целиком. \d{3} совпадёт и внутри abc123def. Если нужна
проверка «строка целиком состоит из трёх цифр», ставьте оба якоря: ^\d{3}$.
Перепутали [] и (). Квадратные скобки означают «один из перечисленных
символов», [abc] совпадёт с одной буквой a, b или c. Круглые скобки
задают группу, (abc) совпадёт только с точной последовательностью «abc»
целиком.
Коротко
- Регулярное выражение читается токен за токеном.
\d,\w,\s— классы символов,*,+,?,{n,m}— сколько раз,^и$— границы строки. - Квантификаторы жадные по умолчанию, добавьте
?после них, чтобы сделать ленивыми. - Без флага
gвернётся только первое совпадение. .нужно экранировать (\.), если имеется в виду буквальная точка, а не «любой символ».- Готовые паттерны в голове держать необязательно, проще проверить их на живых данных.
Проверка регулярных выражений
Проверяйте регулярные выражения онлайн для JavaScript, PHP и Python: подсветка совпадений и групп захвата сразу по мере ввода.
Попробовать



