Синтаксис регулярных выражений простыми словами и шпаргалка regex

2237
Синтаксис регулярных выражений простыми словами и шпаргалка regex

Синтаксис регулярных выражений кажется набором случайных скобок, точек и обратных слешей, пока не начинаешь читать шаблон слева направо. Каждый символ задаёт простое условие. Точка означает один произвольный знак, квадратные скобки выбирают один знак из набора, а фигурные скобки указывают количество повторений.

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

Лучше не заучивать таблицу целиком. Я советую сразу собирать рабочие выражения по частям и проверять каждый добавленный фрагмент. В статье мы сначала разберём базовые конструкции, затем составим шаблоны для даты и российского номера телефона.

Примеры используют распространённый синтаксис, знакомый по JavaScript, Python, PHP, Java и многим текстовым редакторам. Полной универсальности у regex нет. Разные движки по-разному трактуют Unicode, переводы строк, классы символов и некоторые расширенные конструкции. Основы совпадают, но рабочий шаблон всегда нужно проверять в той среде, где код будет запущен.

Базовый синтаксис на одной странице

Конструкция Что означает Пример
. Один произвольный символ к.т найдёт «кот», «кит» и «к7т»
[abc] Один символ из перечисленного набора [км]от найдёт «кот» и «мот»
[0-9] Одна цифра от 0 до 9 [0-9][0-9] найдёт две цифры подряд
d Цифра d{4} найдёт четыре цифры подряд
w Символ слова, точное значение зависит от движка w+ найдёт последовательность символов слова
s Пробельный символ s+ найдёт один или несколько пробелов, табуляций или переводов строк
* Предыдущая конструкция повторяется ноль или больше раз 10* найдёт «1», «10», «100»
+ Предыдущая конструкция повторяется один или больше раз d+ найдёт число любой длины
? Предыдущая конструкция встречается ноль или один раз -? разрешает один необязательный дефис
{2,5} От двух до пяти повторений d{2,5} найдёт число длиной от двух до пяти цифр
^ Начало строки или текста ^d требует цифру в самом начале
$ Конец строки или текста d$ требует цифру в самом конце
Экранирует специальный символ . ищет настоящую точку

Точка . соответствует ровно одному символу. Шаблон д.м найдёт «дом», «дым» и «д7м». Обычный перевод строки точка во многих движках не захватывает, пока разработчик не включит специальный режим наподобие dotAll или DOTALL.

Квадратные скобки [] описывают символьный класс. Движок выбирает из класса один знак, а не всю последовательность. Шаблон [abc] найдёт одну букву a, b или c. Выражение [abc]+ уже найдёт последовательность из перечисленных букв.

Внутри квадратных скобок можно задавать диапазоны. Класс [0-9] означает одну цифру от 0 до 9, [a-z] означает одну строчную латинскую букву. Для русского текста часто пишут [А-Яа-яЁё]. Такой вариант подходит для обычной кириллицы, но не покрывает все письменности Unicode и дополнительные кириллические буквы других языков.

Символ ^ внутри квадратных скобок меняет смысл. Класс [^0-9] означает любой символ, кроме цифры. За пределами класса тот же знак обозначает начало строки.

Классы d, w и s сокращают часто используемые наборы. С d и w связана частая ошибка. В JavaScript d обычно соответствует ASCII-цифрам от 0 до 9, а Python без специального режима может распознавать и другие десятичные цифры Unicode. Класс w в одних движках ограничен латинскими буквами, цифрами и подчёркиванием, в других захватывает множество букв Unicode. Для строгой проверки формата безопаснее явно задавать допустимые символы.

Повторения *, +, ? и {2,5} применяются только к конструкции непосредственно слева. Шаблон ab+ означает букву a, после которой идёт одна или несколько букв b. Для повторения всей последовательности потребуется группа (ab)+.

Квантификатор * допускает отсутствие символа, поэтому d* успешно совпадёт даже с пустой строкой. Начинающие часто используют звёздочку там, где нужна хотя бы одна цифра. В таком случае требуется d+.

Фигурные скобки задают точное или ограниченное количество повторений. Шаблон d{4} требует ровно четыре цифры, d{2,5} допускает от двух до пяти, d{3,} требует не меньше трёх.

Якоря ^ и $ не захватывают символы. Якоря проверяют позицию. Без них выражение d{4} найдёт четыре цифры внутри более длинной строки. Вариант ^d{4}$ требует, чтобы вся строка состояла ровно из четырёх цифр.

В многострочном режиме смысл якорей меняется. ^ и $ могут проверять начало и конец каждой отдельной строки. Поэтому режимы запуска регулярного выражения влияют на результат не меньше самого шаблона.

Обратный слеш превращает специальный символ в обычный. Точка без экранирования означает любой знак, а . означает настоящую точку. Аналогично + ищет плюс, ? вопросительный знак, * звёздочку.

При записи regex внутри программного кода появляется второй уровень экранирования. В Python удобно использовать сырые строки r"d+.d+". В литерале JavaScript тот же шаблон выглядит как /d+.d+/, а в строке для конструктора может потребоваться удвоенный слеш "d+.d+". Синтаксис конкретной среды лучше сверять со справочником MDN или документацией Python.

Собираем выражение для даты

Предположим, нужно проверить дату в формате «день.месяц.год», например 07.11.2026. Начнём с простого требования. День состоит из двух цифр.

d{2}

После дня должна находиться настоящая точка. Обычная точка имеет специальное значение, поэтому экранируем её.

d{2}.

Добавляем две цифры месяца, ещё одну точку и четыре цифры года.

d{2}.d{2}.d{4}

Такое выражение найдёт дату внутри любого текста. Для проверки всего поля добавляем начало и конец строки.

^d{2}.d{2}.d{4}$

Шаблон проверяет структуру, но пропустит 99.99.0000. Можно ограничить день диапазоном от 01 до 31, а месяц диапазоном от 01 до 12. Здесь потребуются две дополнительные базовые конструкции. Круглые скобки объединяют фрагменты, вертикальная черта | означает выбор одного из вариантов.

^(0[1-9]|[12]d|3[01]).(0[1-9]|1[0-2]).d{4}$

Первая группа допускает дни от 01 до 09, от 10 до 29 и от 30 до 31. Вторая группа допускает месяцы от 01 до 09 и от 10 до 12.

Даже улучшенный шаблон считает допустимой дату 31.02.2026. Regex видит форму строки, но не знает календарь. Можно построить огромное выражение с отдельными правилами для месяцев и високосных лет, однако такой код трудно читать, проверять и сопровождать. Надёжнее сначала проверить общий формат регулярным выражением, затем передать значения календарной библиотеке языка программирования.

Регулярное выражение хорошо отвечает на вопрос «похожа ли строка на дату». Полную проверку существования даты должен выполнять код, который понимает календарные правила.

Собираем выражение для номера телефона

Теперь проверим номер в распространённых российских форматах.

+79991234567
 8 999 123 45 67
 +7 (999) 123-45-67

Сначала разрешим два варианта начала, международный +7 и внутренний 8. Плюс нужно экранировать, поскольку без слеша знак работает как квантификатор.

(+7|8)

После кода может стоять пробел или дефис. Класс [ -] допускает один из двух символов, а вопросительный знак делает разделитель необязательным.

(+7|8)[ -]?

Код оператора или региона состоит из трёх цифр. Пользователь может написать цифры с круглыми скобками или без них.

((d{3})|d{3})

Скобки вокруг цифр пришлось экранировать. Без обратных слешей круглые скобки создали бы группу и не искали бы настоящие знаки в тексте.

Оставшаяся часть номера состоит из трёх цифр, затем двух и ещё двух. Между блоками разрешим одиночный пробел или дефис.

^(+7|8)[ -]?((d{3})|d{3})[ -]?d{3}[ -]?d{2}[ -]?d{2}$

Шаблон принимает компактную и визуально разделённую запись. При этом выражение разрешает смешивать пробелы и дефисы, например +7 999-123 45-67. Для большинства форм такой компромисс удобен. Если интерфейс требует один строгий формат, лучше нормализовать ввод или описать каждый допустимый вариант отдельной альтернативой.

Код +7 сам по себе не доказывает, что номер российский. Россия и Казахстан совместно используют седьмую международную зону нумерации, а конкретную принадлежность определяют следующие цифры. Учебный шаблон проверяет форму пользовательского ввода, но не оператора, страну регистрации, активность номера или возможность принять звонок.

Регулярное выражение также не должно превращаться в единственную защиту формы. Пользователь может ввести синтаксически правильный, но несуществующий номер. Когда приложению действительно нужен контакт, номер подтверждают звонком или одноразовым кодом.

Ошибки, из-за которых regex работает не так

  • . без экранирования ищет любой символ, а не точку.
  • * допускает ноль повторений и может совпасть с пустой строкой.
  • + относится только к конструкции слева. Выражение abc+ повторяет букву c, а не слово abc.
  • [] выбирают один символ. Шаблон [cat] не ищет слово «cat».
  • ^ внутри класса и снаружи класса выполняет разные задачи.
  • w нельзя считать универсальным классом для русских слов.
  • d не во всех движках полностью совпадает с [0-9].
  • Шаблон без ^ и $ может найти подходящий фрагмент внутри неправильной строки.
  • Regex проверяет текстовую форму даты или телефона, но не подтверждает существование значения.
  • Слишком сложный шаблон часто надёжнее заменить простой регуляркой и обычным программным кодом.

Полезная привычка состоит в том, чтобы прогонять каждый шаблон минимум по трём наборам. Первый набор должен совпадать, второй выглядеть почти правильно, но содержать ошибку, третий должен быть явно неправильным. Для даты проверьте 07.11.2026, 7.11.2026, 31.02.2026 и случайный текст. Для телефона проверьте запись без разделителей, вариант со скобками, лишнюю цифру и постороннюю букву.

Базовый синтаксис регулярных выражений сводится к нескольким операциям. Символьные классы отвечают за допустимые знаки, квантификаторы управляют количеством, якоря ограничивают область поиска, а обратный слеш отключает специальный смысл символов. После понимания этих четырёх идей большинство коротких regex перестаёт выглядеть шифром.

Начинайте с простого выражения, добавляйте по одному условию и сразу проверяйте результат. Не пытайтесь заставить одну регулярку проверять бизнес-правила, календарь, телефонную нумерацию и существование данных. Regex лучше всего работает как точный фильтр текстового формата, а не как замена полноценной логике программы.

Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
17.09
11:00
Вебинар SECURITM
Как за 10 шагов превратить формальность в реальное управление рисками?
17 сентября эксперт SECURITM объяснит, где заканчивается модель угроз и начинается риск-менеджмент — и почему выбирать между ними не нужно.
Регистрируйтесь!
Реклама. 18+ ООО «Секъюритм» ИНН 7820074059

Рекламодатель
ООО «СерчИнформ»
ИНН: 7704306397
searchinform.ru↗
ИИ-ассистент СерчИнформ