Регулярные выражения: руководство с примерами
Регулярные выражения (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.c → abc, 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 или 1 | colou?r → color, 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-движка:
| Флаг | Название | Что делает |
|---|---|---|
g | global | Ищет все совпадения, а не только первое |
i | ignoreCase | Игнорирует регистр |
m | multiline | ^ и $ работают для каждой строки |
s | dotAll | . совпадает и с \n |
// Без флага i — регистр важен
"Hello hello HELLO".match(/hello/g);
// → ['hello']
// С флагом i — регистр игнорируется
"Hello hello HELLO".match(/hello/gi);
// → ['Hello', 'hello', 'HELLO']
Практические паттерны
Теперь к самому полезному — готовые регулярные выражения для типичных задач. Каждый паттерн можно скопировать и проверить в Regex Тестере с подсветкой совпадений.
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.