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 — там видно пошаговое совпадение и объяснение каждой части шаблона. Со временем синтаксис станет интуитивным и перестанет пугать.

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

    Комментарии

    0

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

    Angular — часть карты развития Frontend

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

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

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

    Основы разработки

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга5.0
    бесплатно
    Подробнее
    изображение курса

    Основы Git

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

    HTML и CSS

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

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

    Картинка поста Вопросы на собеседовании Junior Frontend: разбор с примерами кода
    Иконка аватараАнтон
    Иконка календаря13 сентября 2026
    frontendjavascriptсобеседование+ 2juniorИконка уровня junior

    Вопросы на собеседовании Junior Frontend: разбор с примерами кода

    Собеседование Junior Frontend: вопросы по JavaScript, CSS, DOM и асинхронности с примерами кода и разбором частых ошибок кандидатов.

    Иконка чипа0
    Иконка глаза89
    Иконка комментариев0
    Картинка поста Vue vs React в 2026: какой фреймворк выбрать для проекта
    Иконка аватараАнтон
    Иконка календаря10 сентября 2026
    VueReactFrontend+ 1middleИконка уровня middle

    Vue vs React в 2026: какой фреймворк выбрать для проекта

    Сравниваем Vue и React в 2026 году: реактивность, Composition API vs хуки, Server Components и Vapor Mode на примерах кода.

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

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

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

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