PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Регулярные выражения в JavaScript: полное руководство

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

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

    Антон Ларичев

    Иконка календаря06 августа 2026
    JavaScriptрегулярные выраженияregexpстрокиfrontendmiddleИконка уровня middle
    Картинка поста Регулярные выражения в JavaScript: полное руководство

    Введение

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

    Создание регулярного выражения

    В JavaScript регулярное выражение — это объект типа RegExp. Его можно создать двумя способами.

    Литеральный синтаксис (предпочтительный для статических шаблонов):

    const regex = /javascript/i; // ищем слово без учёта регистра
    

    Через конструктор (когда шаблон динамический):

    const keyword = 'javascript';
    const regex = new RegExp(keyword, 'i'); // шаблон формируется из переменной
    

    Используйте конструктор, когда шаблон известен только во время выполнения программы, например строится из пользовательского ввода.

    Основные метасимволы

    Метасимволы — специальные символы с особым значением в регулярных выражениях.

    Символ Значение
    . Любой символ кроме переноса строки
    \d Цифра (0–9)
    \w Буква, цифра или _
    \s Пробельный символ
    ^ Начало строки
    $ Конец строки
    const emailRegex = /^\w+@\w+\.\w+$/;
    console.log(emailRegex.test('user@mail.ru')); // true
    console.log(emailRegex.test('не email'));      // false
    

    Заглавные версии (\D, \W, \S) означают противоположное: не цифра, не буква, не пробел.

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

    Квантификаторы задают количество повторений предшествующего элемента.

    // * — ноль или более повторений
    // + — одно или более повторений
    // ? — ноль или одно повторение
    // {n,m} — от n до m повторений
    
    const phoneRegex = /^\+7\d{10}$/;
    console.log(phoneRegex.test('+79991234567')); // true
    console.log(phoneRegex.test('+7999'));         // false — меньше 10 цифр
    

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

    const html = '<b>жирный</b> и <b>ещё жирный</b>';
    
    const жадный = html.match(/<b>.*<\/b>/);
    console.log(жадный[0]); // '<b>жирный</b> и <b>ещё жирный</b>'
    
    const ленивый = html.match(/<b>.*?<\/b>/);
    console.log(ленивый[0]); // '<b>жирный</b>' — остановился на первом совпадении
    

    Флаги

    Флаги меняют поведение регулярного выражения и указываются после закрывающего слэша.

    const text = 'JavaScript — это javascript и JAVASCRIPT';
    
    // g — глобальный поиск (все совпадения)
    // i — без учёта регистра
    // m — многострочный режим
    
    const matches = text.match(/javascript/gi);
    console.log(matches); // ['JavaScript', 'javascript', 'JAVASCRIPT']
    

    Флаг s (dotAll) заставляет . совпадать в том числе с символами переноса строки — полезно при парсинге многострочного текста.

    Методы работы с регулярными выражениями

    test и exec — методы RegExp

    const regex = /\d+/;
    
    // test — возвращает true/false
    console.log(regex.test('в тексте 42 символа')); // true
    
    // exec — возвращает массив с деталями совпадения или null
    const result = regex.exec('в тексте 42 символа');
    console.log(result[0]);    // '42' — найденная подстрока
    console.log(result.index); // 9 — позиция начала совпадения
    

    match, matchAll, replace — методы String

    const str = 'Цена: 100 рублей, скидка: 20 рублей';
    
    // match с флагом g возвращает все совпадения
    const prices = str.match(/\d+/g);
    console.log(prices); // ['100', '20']
    
    // matchAll возвращает итератор с подробной информацией
    for (const match of str.matchAll(/\d+/g)) {
      console.log(`Найдено: ${match[0]} на позиции ${match.index}`);
    }
    
    // replace с функцией-обработчиком
    const doubled = str.replace(/\d+/g, (num) => num * 2);
    console.log(doubled); // 'Цена: 200 рублей, скидка: 40 рублей'
    

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

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

    const dateStr = '2024-03-15';
    const dateRegex = /(\d{4})-(\d{2})-(\d{2})/;
    const match = dateStr.match(dateRegex);
    
    console.log(match[1]); // '2024' — год
    console.log(match[2]); // '03'   — месяц
    console.log(match[3]); // '15'   — день
    

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

    const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
    const { year, month, day } = dateStr.match(regex).groups;
    console.log(year, month, day); // '2024' '03' '15'
    

    Чтобы сгруппировать элементы без захвата, используйте (?:...) — такая группа не попадает в match и не тратит память.

    Частые ошибки

    1. Забыть экранировать спецсимволы

    Символы ., *, +, ?, (, ), [, ], {, }, `, ^, $, | имеют специальное значение. Чтобы использовать их буквально, поставьте перед ними `:

    // неправильно — точка совпадёт с любым символом
    const wrong = /3.14/;
    console.log(wrong.test('3X14')); // true — неожиданный результат
    
    // правильно — экранируем точку
    const correct = /3\.14/;
    console.log(correct.test('3X14')); // false
    

    2. Забыть флаг g при замене всех вхождений

    const str = 'foo foo foo';
    console.log(str.replace(/foo/, 'bar'));  // 'bar foo foo' — только первое
    console.log(str.replace(/foo/g, 'bar')); // 'bar bar bar' — все вхождения
    

    3. Переиспользование exec с флагом g без сброса lastIndex

    При флаге g объект RegExp хранит позицию последнего совпадения в lastIndex. Если переиспользовать один объект, следующий поиск начнётся не с начала строки:

    const regex = /\d+/g;
    const str = 'a1 b2 c3';
    
    console.log(regex.exec(str)); // ['1'], lastIndex = 2
    console.log(regex.exec(str)); // ['2'], lastIndex = 5
    console.log(regex.exec(str)); // ['3'], lastIndex = 8
    console.log(regex.exec(str)); // null — поиск начат с конца строки!
    
    // решение: используйте matchAll или сбрасывайте lastIndex
    regex.lastIndex = 0;
    

    4. Катастрофический возврат (ReDoS)

    Вложенные квантификаторы на перекрывающихся группах могут вызвать экспоненциальное время выполнения на специально составленных строках:

    // опасный паттерн — не используйте в production без проверки
    const dangerous = /^(a+)+$/;
    // для строки 'aaaaaaaaab' движок перебирает экспоненциальное число вариантов
    

    Проверяйте паттерны с граничными входными данными и используйте инструменты анализа вроде safe-regex.

    Заключение

    Регулярные выражения в JavaScript — незаменимый инструмент для валидации форм, парсинга текста и трансформации данных. Начните с базовых метасимволов и методов test, match, replace, затем переходите к группам захвата, флагам и «ленивым» квантификаторам. Проверяйте регулярки на сервисе regex101.com — там видно пошаговое совпадение и объяснение каждой части шаблона. Со временем синтаксис станет интуитивным и перестанет пугать.

    Иконка глаза1

    Комментарии

    0

    Постройте личный план изучения Neovim - практика и настройка до уровня Middle — бесплатно!

    Neovim - практика и настройка — часть карты развития Frontend, Backend, DevOps

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    React и Redux Toolkit

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Zustand

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Next.js - с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.7
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста React useState и useEffect: полное руководство 2024
    Иконка аватараАнтон
    Иконка календаря29 июля 2026
    ReactuseStateuseEffect+ 3juniorИконка уровня junior

    React useState и useEffect: полное руководство 2024

    Разбираем useState и useEffect с нуля: как управлять состоянием и побочными эффектами в React-компонентах с реальными примерами.

    Иконка чипа0
    Иконка глаза596
    Иконка комментариев0
    Картинка поста Async await в JavaScript: подробный разбор с примерами
    Иконка аватараАнтон
    Иконка календаря19 июля 2026
    JavaScriptasync/awaitасинхронность+ 3middleИконка уровня middle

    Async await в JavaScript: подробный разбор с примерами

    Разбираем async/await в JavaScript с нуля: как работает синтаксис, обработка ошибок через try/catch, параллельные запросы с Promise.all и частые ошибки

    Иконка чипа0
    Иконка глаза618
    Иконка комментариев0
    Картинка поста CSS Grid: полное руководство по сеткам в 2024
    Иконка аватараАнтон
    Иконка календаря18 июля 2026
    csscss-gridвёрстка+ 2middleИконка уровня middle

    CSS Grid: полное руководство по сеткам в 2024

    CSS Grid — мощная система сеток для создания двумерных макетов. Разбираем все свойства, паттерны и типичные ошибки на практических примерах.

    Иконка чипа+1
    Иконка глаза459
    Иконка комментариев0
    Иконка чипа0