Перейти к основному содержимому

Регулярные выражения — синтаксис с нуля

Разработчику Аналитику Тестировщику

Предыдущий шаг: введение и лаборатория.
Следующий: группы и замена.


Как движок «читает» текст

Представьте указатель на первом символе строки. Шаблон тоже читается слева направо. Каждый кусок шаблона либо совпал с текущим местом в тексте, либо поиск на этой позиции не удался.

Строка для примеров:

user_12 вошёл в систему

Шаблон user — три обычные буквы подряд. Указатель сдвигается: user. Совпадение: слово user.

Шаблон User без флага игнорирования регистра на user не подойдёт: регистр важен.


Литералы — «ищи как написано»

Литерал — символ без спецсмысла: буква, цифра, многие знаки препинания.

ШаблонТекстРезультат
12user_12Найдёт 12 внутри слова
_user_12Найдёт подчёркивание

Цифры и буквы в шаблоне — это «найди такой же символ в тексте».


Точка . — «любой один символ»

. = один любой символ, кроме перевода строки (в большинстве движков).

ШаблонТекстЧто найдёт
u.eruseru, потом любой символ, потом eruser
u.eru_eru_er

Точка не означает «сколько угодно символов». Для повторений нужны квантификаторы (*, +, …).

Чтобы найти настоящую точку в тексте, её экранируют: \. (см. ниже).


Класс символов [ ... ]

В квадратных скобках перечисляют, какой один символ допустен на этом месте.

ШаблонСмысл
[abc]a, b или c
[a-z]любая строчная латинская буква
[A-Za-z0-9]буква или цифра
[._-]точка, подчёркивание или дефис

Пример: [Tt]he — заглавная или строчная T, затем he → подойдут The и the.

Внутри [ ] точка — обычная точка, не «любой символ». Шаблон ar[.] ищет буквы a, r и символ ..

Отрицание — [^ ... ]

^ сразу после открывающей [ означает «любой символ, кроме перечисленных»:

ШаблонСмысл
[^0-9]всё, кроме цифры
[^@\s]+подряд символы без @ и без пробела (упрощённо — кусок «до @»)

Путаница с кареткой
^ в начале всего шаблона — «начало строки». ^ внутри [^...] — «не этот набор». Это разные роли одного символа.


Сокращения \d, \w, \s

КодОбычно значитПример
\dцифра 0–9\d\d12
\wбуква, цифра, _ (часто только латиница)\w+user_12
\sпробел, таб, перевод строки\s+ → пробелы
\D, \W, \S«всё, кроме» соответствующего класса

Кириллица: в JavaScript \w не совпадает с ё или п. Для русского текста явно пишут [а-яА-ЯёЁ0-9_] или используют Unicode-классы (\p{L}), если движок поддерживает.


Квантификаторы — «сколько раз повторять»

Квантификатор относится к предыдущему символу или группе.

СимволСколько разПримерПодходит к
*0 и большеab*cac, abc, abbc
+1 и большеab+cabc, не ac
?0 или 1colou?rcolor, colour
{3}ровно 3\d{3}123
{2,4}от 2 до 4\d{2,4}12, 1234
{2,}2 и больше\d{2,}99, 12345

Пример: [a-z]* — «ноль или больше строчных латинских букв подряд».

.* — «ноль или больше любых символов» (очень жадно; про жадность — в 1114).


Якоря ^ и $

СимволСмысл
^начало строки (или начало строки в многострочном режиме — 1114)
$конец строки

Без якорей шаблон ищет подстроку где угодно. С якорями — всю строку целиком (удобно для форм).

ШаблонСтрокаРезультат
oknot okсовпадение есть (ok внутри)
^ok$not okнет
^ok$okда

Экранирование \

Символы . * + ? ^ $ [ ] ( ) { } | \ в шаблоне имеют спецсмысл. Чтобы искать их как текст, ставят \ перед символом:

Нужен символВ шаблоне
точка\.
плюс\+
скобка\( \)
обратный слэш\\

В коде на Python/C# часто используют сырую строку r"..." / @"...", чтобы не удваивать слэши.


Сквозной разбор — логин пользователя

Правила (упрощённо):

  • от 3 до 16 символов;
  • только латиница, цифры, _ и -;
  • первый символ — буква.

Шаблон:

^[a-z][a-z0-9_-]{2,15}$

Читаем по частям:

ЧастьЗначение
^строка начинается здесь
[a-z]первая буква — одна строчная латинская
[a-z0-9_-]дальше буква, цифра, _ или -
{2,15}таких символов от 2 до 15 (вместе с первой буквой — 3…16)
$строка заканчивается здесь

Проверка:

СтрокаПодходит?Почему
jo-hn_doeда
john12да
Joнетзаглавная в начале
abнетвсего 2 символа
jo hnнетпробел запрещён

Тот же приём — для имени файла data_2026.csv: буквы, подчёркивание, цифры, точка перед расширением.


Сквозной разбор — уровень в логе

Строка:

2026-01-22 14:30:05 [ERROR] Connection timeout

Найти слово ERROR в скобках:

\[ERROR\]
ЧастьЗначение
\[буквальная [
ERRORтекст как есть
\]буквальная ]

Чтобы поймать любой уровень (INFO, WARN, …), позже пригодится альтернатива и группы: \[(INFO|WARN|ERROR)\].


Шпаргалка шага 1

ЗадачаИдея шаблона
Точное словолитералы: error
«Что-то между».* (осторожно с жадностью)
Только цифры^\d+$
Дата ДД-ММ-ГГГГ^\d{2}-\d{2}-\d{4}$
Кусок до пробела[^\s]+

Потренируйтесь в лаборатории (пресеты Email и Дата).

Дальше: Группы и замена →

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).