Регулярные выражения в JavaScript представляют собой механизм работы
с текстовыми данными, позволяющий описывать шаблоны строк и выполнять
поиск, проверку, извлечение и замену фрагментов текста с высокой
гибкостью. Этот инструмент встроен в язык и реализован через объект
RegExp, а также набор методов строк.
Регулярное выражение — это формальный шаблон, описывающий множество строк. В JavaScript оно может быть создано двумя способами:
const re1 = /abc/;
const re2 = new RegExp("abc");
Первый вариант — литерал регулярного выражения, второй — конструктор, позволяющий динамически формировать шаблон.
Ключевое отличие заключается в том, что литерал компилируется один
раз при парсинге кода, тогда как RegExp может создаваться
во время выполнения.
Регулярные выражения чаще всего используются через методы строк:
match() — поиск совпаденийsearch() — индекс первого совпаденияreplace() — замена подстрокsplit() — разбиение строкиПример поиска:
const text = "hello world";
console.log(text.match(/world/));
Флаги изменяют поведение поиска.
g — глобальный поиск (все совпадения)i — нечувствительность к региструm — многострочный режимs — точка (.) включает переносы строкu — работа с Unicodey — «липкий» режим (поиск с текущей позиции)Пример:
const re = /abc/gi;
Регулярные выражения используют специальные символы, задающие поведение шаблона.
. — любой символ, кроме перевода строки^ — начало строки$ — конец строки* — 0 или более повторений+ — 1 или более повторений? — 0 или 1 повторение{n} — ровно n повторений{n,} — n или больше{n,m} — от n до m повторенийПример:
const re = /^a.*z$/;
Символьные классы позволяют задавать набор допустимых символов.
[abc] — любой символ a, b или c[a-z] — диапазон букв[0-9] — цифры[^0-9] — любой символ, кроме цифрПример проверки числа:
const re = /^[0-9]+$/;
JavaScript предоставляет сокращённые обозначения:
\d — цифра\D — не цифра\w — символ слова (буквы, цифры, _)\W — не символ слова\s — пробельный символ\S — не пробелПример:
const re = /\d{3}-\d{2}-\d{2}/;
Квантификаторы определяют количество повторений символа или группы.
По умолчанию они жадные, то есть захватывают максимально возможное совпадение.
const text = "<b>bold</b>";
console.log(text.match(/<.*>/));
Результат: <b>bold</b>
Чтобы сделать поведение «ленивым», используется ?:
console.log(text.match(/<.*?>/));
Результат: <b>
Скобки позволяют группировать выражения:
const re = /(ab)+/;
Захваченные группы доступны в результате match:
const result = "ababab".match(/(ab)+/);
console.log(result[0]);
console.log(result[1]);
Если группа нужна только для логики, но не для захвата, используется
?::
const re = /(?:ab)+/;
Это снижает накладные расходы и упрощает результаты.
Современный JavaScript поддерживает именование групп:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
Использование:
const match = "2026-05-21".match(re);
console.log(match.groups.year);
Символ | работает как логическое «или»:
const re = /cat|dog/;
Совпадение будет либо с cat, либо с
dog.
Регулярные выражения поддерживают якоря:
^ — начало строки$ — конец строки\b — граница слова\B — не граница словаПример поиска слова:
const re = /\bword\b/;
Это нулевые утверждения, проверяющие контекст без включения его в результат.
const re = /foo(?=bar)/;
const re = /foo(?!bar)/;
const re = /(?<=bar)foo/;
const re = /(?<!bar)foo/;
Помимо методов строк, существует API самого регулярного выражения:
test() — проверка совпаденияexec() — извлечение совпадений с подробной
информациейПример:
const re = /\d+/;
console.log(re.test("123"));
При использовании g поведение exec
изменяется: регулярное выражение хранит внутренний индекс
lastIndex.
const re = /\d+/g;
const str = "12 34 56";
console.log(re.exec(str));
console.log(re.exec(str));
Каждый вызов продолжает поиск с последней позиции.
Флаг u обеспечивает корректную работу с многобайтовыми
символами:
const re = /\u{1F600}/u;
Без u такие символы могут обрабатываться
некорректно.
const re = /^[\w.-]+@[\w.-]+\.[a-z]{2,}$/i;
const re = /^\+?\d{10,15}$/;
const re = /\d+/g;
const text = "2026-05-21";
const result = text.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3.$2.$1");
Результат: 21.05.2026
replace может принимать функцию:
const text = "1 2 3";
const result = text.replace(/\d/g, (match) => {
return Number(match) * 2;
});
g с test()Специальные символы нужно экранировать:
const re = /\./;
Если этого не сделать, символ будет интерпретирован как метасимвол.
Регулярные выражения могут становиться узким местом при:
Оптимизация часто сводится к упрощению шаблонов и снижению количества альтернатив.
Строковые методы быстрее и проще, но ограничены:
includes() — простое наличиеstartsWith() — начало строкиendsWith() — конец строкиРегулярные выражения применяются, когда требуется сложная логика сопоставления.
Регулярные выражения активно применяются в:
Их роль особенно заметна в задачах, где структура текста изменчива и не фиксирована заранее.