Введение в регулярные выражения

Введение в регулярные выражения #

Регулярное выражение (RegExp) — объект, описывающий шаблон поиска в тексте. В JavaScript regex применяют для валидации ввода, извлечения полей из API-ответов и нормализации пользовательских данных. Для простой замены одной подстроки достаточно методов строки; regex оправдан, когда правило повторяется или зависит от структуры текста.


Литерал /шаблон/флаги #

Самый частый способ — слэшевый литерал:

const skuPattern = /^[A-Z]{2}-\d{2}-[A-Z0-9]+$/

skuPattern.test('KB-01-XL') // true
skuPattern.test('kb-01') // false

Литерал удобен, когда шаблон известен на этапе написания кода. Обратные слэши внутри литерала экранируют спецсимволы regex (не путать с экранированием в обычных строках).


Конструктор new RegExp() #

Когда шаблон собирается из переменных, используйте конструктор:

const field = 'orderId'
const dynamic = new RegExp(`^${field}:\\s*[a-z0-9-]+$`, 'i')

dynamic.test('orderId: ord-2026-7f3a') // true

В строке для конструктора каждый \ удваивается: \\d вместо \d. Динамические шаблоны требуют осторожности: не вставляйте пользовательский ввод напрямую — риск ReDoS и неожиданного поведения.


Флаги #

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

ФлагНазначение
gglobal — все совпадения, не только первое
iignore case — без учёта регистра
mmultiline — ^ и $ привязаны к границам строк, не всего текста
uunicode — корректная работа с суррогатными парами и \u{...}
sdotAll — . захватывает перевод строки
ysticky — поиск только с lastIndex, без пропуска

Примеры на данных чекаута:

// g — все коды валют в описании
'цена 1500 RUB, доставка 300 RUB'.match(/RUB/g)
// ['RUB', 'RUB']

// i — статус без учёта регистра
/^delivered$/i.test('Delivered') // true

// m — каждая строка трек-листа отдельно
const playlist = `focus - track 1
work - track 2`
/^work/m.test(playlist) // true — совпадение во второй строке

Флаг u важен для emoji и символов вне BMP:

const title = 'Плейлист 🎧 Focus'
/🎧/u.test(title) // true

Флаг s позволяет . пересекать \n — удобно для многострочных шаблонов адреса:

const block = `адрес: ул. Пример, 5
кв. 12`
/адрес:[\s\S]+/s.test(block) // true

Флаг y привязывает exec к позиции lastIndex — см. Методы RegExp и String.


Свойства объекта RegExp #

const re = /ord-\d{4}/gi

re.source // "ord-\\d{4}" — исходный шаблон
re.flags // "gi"
re.global // true
re.ignoreCase // true
re.multiline // false
re.unicode // false
re.sticky // false
re.dotAll // false

Проверка типа:

const phoneRe = /\d{10}/
typeof phoneRe // "object"
phoneRe instanceof RegExp // true

Когда regex, а когда нет #

ЗадачаПодход
Есть ли подстрока expressstr.includes('express')
Заменить одно словоstr.replace('руб', '₽')
SKU строго XX-NN-XXXregex с якорями ^ $
Извлечь все суммы из чекаregex с флагом g и match

Правило: начните со строковых методов; переходите к regex, когда шаблон описывает класс строк, а не одно фиксированное значение.


Практика: проверка формата заказа #

const ORDER_ID = /^ord-\d{4}-[a-f0-9]{4}$/

function isValidOrderId(id) {
  return typeof id === 'string' && ORDER_ID.test(id.trim())
}

isValidOrderId('ord-2026-7f3a') // true
isValidOrderId('order-2026') // false
const TRACK_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/

function normalizeSlug(input) {
  const slug = input.trim().toLowerCase().replace(/\s+/g, '-')
  return TRACK_SLUG.test(slug) ? slug : null
}

normalizeSlug('Night Drive') // "night-drive"
normalizeSlug('!!!') // null

Итог #

  • RegExp описывает шаблон поиска; литерал /.../флаги — основной синтаксис в коде.
  • Конструктор new RegExp(pattern, flags) нужен для динамических шаблонов.
  • Флаги g, i, m покрывают большинство задач; u, s, y — для Unicode, многострочного . и sticky-поиска.
  • Для простых проверок предпочтительны includes и startsWith; regex — для структурированных форматов.

См. также #