Что такое регулярные выражения и где их проверять
Регулярное выражение (regex, регулярка) - шаблон, который описывает, как выглядит нужный кусок текста. С его помощью находят телефоны в документе, проверяют формат почты в форме, вытаскивают даты из логов, массово переименовывают переменные в редакторе.
Синтаксис почти одинаков в Python, JavaScript, PHP, Java и в поиске VS Code, потому что все они выросли из одного семейства (Perl-совместимые выражения). Различаются детали: флаги, именованные группы, функции для поиска и замены. Они разобраны ниже отдельно.
Писать регулярку вслепую не нужно. Откройте regex101.com: слева выбираете диалект (Python или ECMAScript), вставляете шаблон и тестовый текст, а справа сайт объясняет каждый символ шаблона и подсвечивает совпадения. В VS Code то же самое работает в поиске по Ctrl+F, если включить значок .*.
Шпаргалка: символы и классы
Начнем с базовых кирпичиков. Обычные буквы и цифры совпадают сами с собой, а специальные символы . ^ $ * + ? ( ) [ ] { } | \ нужно экранировать обратным слешем, если вы ищете их буквально: \. найдет точку.
| Шаблон | Что означает | Пример совпадения |
|---|---|---|
. | Любой символ, кроме перевода строки | к.т - кот, кит |
\d | Цифра | \d\d - 42 |
\D | Не цифра | буква, пробел |
\w | Буква, цифра или подчеркивание | \w+ - user_1 |
\W | Не \w | пробел, запятая |
\s | Пробельный символ: пробел, таб, перевод строки | \s+ - несколько пробелов |
[abc] | Один символ из набора | [аеиоу] - гласная |
[^abc] | Любой символ, кроме перечисленных | [^0-9] - не цифра |
[а-яё] | Диапазон | строчная русская буква |
a|b | Или | кот|пес |
Про кириллицу. В Python 3 \w по умолчанию понимает Unicode и находит русские буквы. В JavaScript \w - это только латиница, цифры и подчеркивание, даже с флагом u. Для русского текста в JS пишите [а-яё] с флагом i или \p{L} с флагом u. И не забывайте про букву ё: в диапазон а-я она не входит.
Квантификаторы и якоря
Квантификатор говорит, сколько раз повторяется предыдущий символ или группа.
| Шаблон | Сколько раз | Пример |
|---|---|---|
* | 0 и больше | \d* |
+ | 1 и больше | \d+ - любое число |
? | 0 или 1 | https? - http и https |
{3} | Ровно 3 | \d{3} - 495 |
{2,4} | От 2 до 4 | \w{2,4} |
{2,} | 2 и больше | \s{2,} - двойные пробелы |
Якоря не совпадают с символами, они отмечают позицию. ^ - начало строки, $ - конец, \b - граница слова. Шаблон ^\d+$ проверит, что вся строка состоит из цифр, а не просто содержит их. Без якорей проверка формата пропустит строку вида abc123.
Жадность
Квантификаторы по умолчанию жадные: захватывают как можно больше. Шаблон <.+> в строке <b>текст</b> найдет всю строку целиком, а не первый тег. Ленивая версия с вопросительным знаком <.+?> остановится на первой закрывающей скобке. Для HTML, впрочем, лучше брать парсер, а не регулярки.
Группы, обратные ссылки и проверки
Круглые скобки объединяют часть шаблона в группу. На нее можно повесить квантификатор, ее содержимое можно достать отдельно или подставить при замене.
(\d{2})\.(\d{2})\.(\d{4})- дата, день, месяц и год попадут в группы 1, 2 и 3.(?:ab)+- группа без захвата, нужна только для повторения.(?P<year>\d{4})в Python и(?<year>\d{4})в JavaScript - именованная группа. Буква P в Python обязательна, форма без нее вызовет ошибку unknown extension.\1- обратная ссылка на первую группу внутри шаблона:(\w+) \1найдет повтор слова "что что".(?=...)и(?!...)- опережающая проверка:\d+(?= руб)найдет число, только если за ним идет " руб".(?<=...)и(?<!...)- ретроспективная проверка:(?<=\$)\d+найдет сумму после знака доллара. В JavaScript поддерживается всеми современными браузерами и Node.js.
В строке замены группы обозначаются по-разному: в Python \1 или \g<year>, в JavaScript $1 или $<year>.
Регулярные выражения в Python: модуль re
В Python регулярки живут в стандартном модуле re. Шаблоны пишите в raw-строках с префиксом r, иначе Python сам начнет обрабатывать обратные слеши, и \b превратится в символ backspace.
import re
text = "Заказ 145 от 03.10.2026, заказ 77 от 15.10.2026"
re.search(r"\d+", text).group() # '145' - первое совпадение
re.findall(r"заказ (\d+)", text, re.I) # ['145', '77']
re.sub(r"(\d{2})\.(\d{2})\.(\d{4})", r"\3-\2-\1", text)
# 'Заказ 145 от 2026-10-03, заказ 77 от 2026-10-15'
for m in re.finditer(r"(?P<d>\d{2})\.(?P<m>\d{2})", text):
print(m.group("d"), m.group("m"))
re.fullmatch(r"\+7\d{10}", "+79161234567") # проверка формата целиком
re.split(r"[,;]\s*", "a, b;c") # ['a', 'b', 'c']
| Функция | Что возвращает |
|---|---|
re.search | Первое совпадение в любом месте строки или None |
re.match | Совпадение только с начала строки или None |
re.fullmatch | Совпадение всей строки целиком или None |
re.findall | Список строк (или кортежей, если в шаблоне несколько групп) |
re.finditer | Итератор объектов Match с позициями и группами |
re.sub | Новую строку с заменами |
re.compile | Скомпилированный шаблон для многократного использования |
Флаги передаются аргументом: re.I (без учета регистра), re.M (^ и $ для каждой строки), re.S (точка ловит и перевод строки), re.X (можно писать шаблон с пробелами и комментариями). Если Python у вас еще не установлен, начните с инструкции как установить Python на Windows.
Регулярные выражения в JavaScript
В JavaScript регулярка - это объект RegExp. Чаще его пишут литералом между слешами, флаги ставятся после закрывающего слеша.
const text = "Заказ 145 от 03.10.2026, заказ 77 от 15.10.2026";
/\d+/.test(text); // true
text.match(/\d+/g); // ['145', '03', '10', '2026', ...]
text.replace(/(\d{2})\.(\d{2})\.(\d{4})/g, "$3-$2-$1");
for (const m of text.matchAll(/(?<d>\d{2})\.(?<m>\d{2})/g)) {
console.log(m.groups.d, m.groups.m);
}
const re = new RegExp("заказ\\s(\\d+)", "gi"); // слеши удваиваются
Главные отличия от Python, которые ловят новичков:
- Без флага
gметодreplaceзаменит только первое совпадение, аmatchвернет одно совпадение с группами.matchAllиreplaceAllс регуляркой безgвыбросят TypeError. - Регулярка с флагом
gпомнит позицию в свойствеlastIndex. Если вызватьtestодной и той же регуляркой дважды подряд, второй результат может удивить. Для проверок формата флагgне ставьте. - В конструкторе
new RegExp("...")шаблон - обычная строка, поэтому каждый обратный слеш пишется дважды. - Флаги:
g(все совпадения),i(регистр),m(многострочный),s(точка ловит перевод строки),u(Unicode и\p{...}),y(поиск строго с lastIndex),d(индексы групп).
Регулярки в JS часто комбинируют с методами массивов, например фильтруют список строк: emails.filter(e => /@gmail\.com$/i.test(e)). Про filter, map и reduce подробно в статье методы массивов JavaScript.
Готовые регулярные выражения для частых задач
Шаблоны ниже упрощенные и подходят для учебных задач и быстрой проверки. Для боевой валидации почты и телефонов лучше брать проверенные библиотеки.
- Российский мобильный:
^(\+7|8)\d{10}$(без пробелов и скобок). - Телефон с любыми разделителями: сначала удалите все лишнее
re.sub(r"\D", "", phone), потом проверяйте длину. - Почта (упрощенно):
^[\w.+-]+@[\w-]+\.[\w.-]+$. - Дата ДД.ММ.ГГГГ:
^\d{2}\.\d{2}\.\d{4}$. Проверяет формат, а не существование даты: 31.02 пройдет. - Почтовый индекс РФ:
^\d{6}$. - IPv4 (формат):
^(\d{1,3}\.){3}\d{1,3}$, диапазон 0-255 не проверяется. - Двойные пробелы:
\s{2,}, замена на один пробел. - Хештеги:
#\w+в Python,#[\p{L}\d_]+с флагомuв JS.
Не пытайтесь одной огромной регуляркой проверить все сразу. Сначала нормализуйте строку обычным кодом (обрезка пробелов, удаление скобок и дефисов), потом проверяйте короткий шаблон, а сложную логику вроде корректности даты делайте через datetime.strptime в Python или Date в JS. Такой код проще читать и поддерживать, и он не зависнет на хитром вводе из-за катастрофического возврата.
Частые ошибки в регулярках
- Неэкранированная точка.
site.ruсовпадет и с "siteXru". Пишитеsite\.ru. - Нет якорей при проверке.
\d{6}найдет индекс внутри строки "1234567890". Для проверки формата нужны^и$илиre.fullmatch. - Строка без r в Python.
"\bслово\b"без префикса r ничего не найдет. - Забытая ё.
[а-я]пропустит слово "ёлка". - Вложенные квантификаторы вроде
(a+)+на длинной строке могут работать минутами. Это называется катастрофический возврат и используется в атаках ReDoS.
Больше практики по языкам ищите в тегах Python и JavaScript.
