EN
Назад к блогу

Регулярные выражения: руководство с примерами

Zikrasoft · · 5 мин чтения
Regex Веб-разработка JavaScript

Регулярные выражения (regex) — один из самых мощных инструментов для работы с текстом в программировании. С их помощью можно искать, проверять и заменять строки по шаблону. Несмотря на пугающий синтаксис, основы regex осваиваются за один вечер — особенно если сразу пробовать примеры в Regex Тестере.

Что такое регулярные выражения?

Регулярное выражение — это шаблон (pattern), описывающий набор строк. Движок regex проверяет, соответствует ли текст этому шаблону, и возвращает найденные совпадения.

В JavaScript регулярное выражение создаётся двумя способами:

// Литерал — удобно для статических паттернов
const re1 = /\d{3}-\d{2}-\d{2}/g;

// Конструктор — когда паттерн формируется динамически
const re2 = new RegExp("\\d{3}-\\d{2}-\\d{2}", "g");

Обратите внимание: в конструкторе RegExp обратный слэш нужно экранировать дважды (\\d вместо \d), потому что строка сама интерпретирует \.

Базовый синтаксис: шпаргалка

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

Символьные классы

СинтаксисЗначениеПример
.Любой символ (кроме \n)a.cabc, a1c
\dЦифра ([0-9])\d{3}123
\wБуква, цифра или _\w+hello_42
\sПробельный символ\s+ → пробелы, табы
\D, \W, \SОтрицание \d, \w, \s\D+abc
[abc]Один из перечисленных[aeiou] → гласные
[^abc]Любой, кроме перечисленных[^0-9] → не цифра
[a-z]Диапазон символов[A-Za-z] → буква

Квантификаторы

СинтаксисЗначениеПример
*0 или более\d*"", "123"
+1 или более\d+"123"
?0 или 1colou?rcolor, colour
{n}Ровно n раз\d{4}2026
{n,m}От n до m раз\d{2,4}12, 123, 1234
{n,}n или более раз\d{2,}12, 12345

По умолчанию квантификаторы жадные — захватывают максимум символов. Добавьте ? для ленивого режима:

const html = "<b>жирный</b> и <b>тоже</b>";

// Жадный: захватит всё от первого <b> до последнего </b>
html.match(/<b>.*<\/b>/g);
// → ['<b>жирный</b> и <b>тоже</b>']

// Ленивый: остановится на ближайшем </b>
html.match(/<b>.*?<\/b>/g);
// → ['<b>жирный</b>', '<b>тоже</b>']

Якоря и границы

СинтаксисЗначение
^Начало строки (или строки при флаге m)
$Конец строки
\bГраница слова
// \b не даёт найти "cat" внутри "concatenate"
"concatenate a cat".match(/\bcat\b/g);
// → ['cat']

Группы и обратные ссылки

Круглые скобки () создают захватывающую группу. Это позволяет извлекать части совпадения:

const dateRegex = /(\d{4})-(\d{2})-(\d{2})/;
const match = "2026-03-21".match(dateRegex);

console.log(match[0]); // '2026-03-21' — полное совпадение
console.log(match[1]); // '2026' — год
console.log(match[2]); // '03' — месяц
console.log(match[3]); // '21' — день

Именованные группы делают код читаемее:

const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const { groups } = "2026-03-21".match(dateRegex);

console.log(groups.year); // '2026'
console.log(groups.month); // '03'
console.log(groups.day); // '21'

Незахватывающая группа (?:...) нужна для логической группировки без сохранения:

// Ищем http или https, но не сохраняем протокол отдельно
const urlRegex = /(?:https?):\/\/[\w.-]+/g;

Флаги: управление поведением

Флаги меняют поведение regex-движка:

ФлагНазваниеЧто делает
gglobalИщет все совпадения, а не только первое
iignoreCaseИгнорирует регистр
mmultiline^ и $ работают для каждой строки
sdotAll. совпадает и с \n
// Без флага i — регистр важен
"Hello hello HELLO".match(/hello/g);
// → ['hello']

// С флагом i — регистр игнорируется
"Hello hello HELLO".match(/hello/gi);
// → ['Hello', 'hello', 'HELLO']

Практические паттерны

Теперь к самому полезному — готовые регулярные выражения для типичных задач. Каждый паттерн можно скопировать и проверить в Regex Тестере с подсветкой совпадений.

Email

const emailRegex = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;

emailRegex.test("user@example.com"); // true
emailRegex.test("user@.com"); // false
emailRegex.test("user+tag@domain.co.uk"); // true

Российский телефон

const phoneRegex =
  /^(\+7|8)[\s-]?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$/;

phoneRegex.test("+7 (999) 123-45-67"); // true
phoneRegex.test("89991234567"); // true
phoneRegex.test("+7-999-123-45-67"); // true

URL

const urlRegex =
  /^https?:\/\/[\w.-]+(?:\.[\w.-]+)+[\/\w._~:?#[\]@!$&'()*+,;=-]*$/;

urlRegex.test("https://example.com"); // true
urlRegex.test("http://sub.domain.com/path?q=1"); // true

IPv4-адрес

const ipRegex =
  /^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/;

ipRegex.test("192.168.1.1"); // true
ipRegex.test("256.1.1.1"); // false
ipRegex.test("10.0.0.1"); // true

Пароль (минимум 8 символов, буквы и цифры)

const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$/;

passwordRegex.test("abc12345"); // true
passwordRegex.test("password"); // false — нет цифр
passwordRegex.test("12345678"); // false — нет букв

Здесь (?=...) — это lookahead (опережающая проверка). Он проверяет условие, не «потребляя» символы.

Частые ошибки и как их избежать

Забыли экранировать спецсимвол. Точка . в regex — это «любой символ». Если нужна буквальная точка, пишите \.:

// Ошибка: найдёт "abc" в "abcdef"
"abcdef".match(/a.c/); // → ['abc']

// Правильно: ищет именно "a.c"
"a.c and abc".match(/a\.c/); // → ['a.c']

Катастрофический откат (catastrophic backtracking). Некоторые паттерны с вложенными квантификаторами вызывают экспоненциальный рост времени выполнения:

// Опасно: (a+)+ на строке "aaaaaaaaaaaaaaaaab" зависнет
// Безопасно: упростите до a+

Правило: избегайте конструкций вида (a+)+, (a|b)*c на ненадёжных входных данных. Если regex принимает пользовательский ввод, всегда устанавливайте таймаут. В Regex Тестере время выполнения отображается в статус-баре — удобно для отлова медленных паттернов.

Жадность по умолчанию. Если regex захватывает больше, чем нужно — добавьте ? к квантификатору для ленивого режима.

Итого

Регулярные выражения — навык, который окупается многократно. Зная базовый синтаксис и имея под рукой набор готовых паттернов, вы решаете большинство задач по обработке текста за считанные минуты.

Проверяйте свои regex в реальном времени с подсветкой совпадений в Regex Тестере — он поддерживает режимы поиска, замены и тестирования с флагами g, i, m, s.

Связанные инструменты