Регулярные выражения в JavaScript: практический старт

Содержание

О проверке кода. Примеры не запускались — в отличие от материалов по Node.js с фактическим выводом. Говорим прямо, а не ставим бейдж «проверено».

Регулярные выражения пугают синтаксисом, но для 90% задач хватает десятка конструкций. Разберём практический минимум для JavaScript — без превращения в справочник.

Что это и как создать

Регулярка — шаблон для поиска и проверки текста. Два способа записи:

const re1 = /\d+/g;                 // литерал — основной способ
const re2 = new RegExp('\\d+', 'g'); // конструктор — когда шаблон в переменной

Литерал /шаблон/флаги используют почти всегда. Конструктор new RegExp нужен, когда шаблон собирается динамически из переменной (тогда спецсимволы экранируют двойным слэшем).

Основные методы

const re = /\d+/;

re.test('abc123');           // true  — есть ли совпадение (быстрая проверка)

'abc123def456'.match(/\d+/g); // ['123', '456'] — все совпадения (с флагом g)

'цена: 100'.replace(/\d+/, 'X'); // 'цена: X' — замена
  • test — есть ли совпадение, возвращает true/false. Самый частый и быстрый;
  • match — извлекает совпадения. С флагом g — массив всех, без него — первое с деталями;
  • replace — заменяет (мы видели его у строк); с регуляркой и флагом g меняет все вхождения.

Синтаксис: минимум, который нужен

Основные конструкции регулярок

Классы символов

Что искать

  • \d — цифра, \D — не цифра
  • \w — буква/цифра/_, \s — пробел
  • . — любой символ
  • [a-z] — диапазон, [абв] — набор

Количество и позиция

Сколько и где

  • + — один и более, * — ноль и более
  • ? — ноль или один, {2,4} — от 2 до 4
  • ^ — начало, $ — конец строки
  • | — или, ( ) — группа
/^\d{4}$/.test('2026');        // true  — ровно 4 цифры от начала до конца
/^\+7\d{10}$/.test('+79001234567'); // телефон: +7 и 10 цифр
/[а-яё]+/i.test('Привет');     // true  — есть кириллица (i = без регистра)

^...$ фиксирует шаблон на всю строку — без них регулярка найдёт совпадение в любом месте. Это частая ошибка валидации: /\d{4}/ совпадёт и в 'abc2026xyz'.

Флаги

/abc/g   // global — все совпадения, не только первое
/abc/i   // ignore case — без учёта регистра
/abc/m   // multiline — ^ и $ работают на каждой строке
/abc/gi  // комбинация флагов

Флаг g — самый важный: без него match и replace обработают только первое совпадение. Флаг i избавляет от [a-zA-Zа-яА-Я] при поиске без учёта регистра. Флаги комбинируются: /.../gi.

Группы захвата

Скобки ( ) вытаскивают части совпадения:

const date = '2026-07-17';
const m = date.match(/(\d{4})-(\d{2})-(\d{2})/);
// m[0] = '2026-07-17' (всё), m[1] = '2026', m[2] = '07', m[3] = '17'

// именованные группы — читаемее
const m2 = date.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
m2.groups.year;   // '2026'
m2.groups.month;  // '07'

Группы ( ) захватывают части совпадения в массив: m[0] — всё совпадение, дальше содержимое групп по порядку. Именованные группы (?<year>...) дают доступ по имени через .groups — код гораздо читаемее, чем m[1], m[2].

Группы работают и в замене:

'2026-07-17'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1');   // '17.07.2026'

match против matchAll

const text = 'цена 100 и 200 рублей';

// match с g — все совпадения, но БЕЗ групп
text.match(/(\d+)/g);   // ['100', '200'] — только совпадения

// matchAll — все совпадения С группами
for (const m of text.matchAll(/(\d+)/g)) {
  console.log(m[0], m.index);   // '100' 5, потом '200' 11
}

Тонкость: match с флагом g возвращает только совпадения, теряя группы. Если нужны и все совпадения, и их группы — берут matchAll, который отдаёт итератор для for...of. Это стандартный способ разобрать много однотипных фрагментов.

Когда регулярку писать НЕ надо

Регулярные выражения — мощный инструмент, но не универсальный:

  • HTML, XML, JSON — не парсите регуляркой. Это вложенные структуры, регулярка ломается на реальных данных. Нужен настоящий парсер (JSON.parse, DOM);
  • сложная валидация email — «правильная» регулярка для email чудовищна и всё равно неполна. Часто достаточно проверить наличие @ и попытаться отправить письмо;
  • простой поиск подстрокиincludes читается лучше, чем /abc/.test().

Правило: если шаблон стал нечитаемым или структура вложенная — регулярка не тот инструмент. Берите парсер или разбейте задачу.


Смежные темы: строки — где применяются регулярки; итераторы и генераторы — matchAll; JSON — вместо парсинга регуляркой. Полный список — в уроках JavaScript.

Частые вопросы

Как проверить строку регулярным выражением?
Метод test возвращает true или false: /\d+/.test(‘abc123’) это true, потому что цифры есть. Это самый быстрый способ проверить, соответствует ли строка шаблону, без извлечения самого совпадения.
Что означают флаги g и i в регулярке?
Флаг g (global) ищет все совпадения, а не только первое. Флаг i (ignore case) делает поиск без учёта регистра. Их пишут после закрывающего слэша: /abc/gi. Можно комбинировать несколько флагов.
Как извлечь части совпадения?
Через группы захвата — круглые скобки в шаблоне. Метод match возвращает массив, где нулевой элемент — всё совпадение, а дальше содержимое групп. Именованные группы (?\d{4}) дают доступ по имени.
Чем отличаются match и matchAll?
match с флагом g возвращает массив всех совпадений, но без групп. matchAll возвращает итератор со всеми совпадениями И их группами — для перебора через for…of. Для извлечения групп из многих совпадений берут matchAll.
Когда не стоит использовать регулярные выражения?
Для разбора HTML, JSON и других вложенных структур — там нужен настоящий парсер, регулярка сломается на реальных данных. Для валидации email сложные регулярки хрупки, часто достаточно простой проверки и попытки отправки.