Введение в регулярные выражения #
Регулярное выражение (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 и неожиданного поведения.
Флаги #
Флаги меняют семантику поиска. Их можно передать вторым аргументом конструктора или записать после закрывающего / в литерале.
| Флаг | Назначение |
|---|---|
g | global — все совпадения, не только первое |
i | ignore case — без учёта регистра |
m | multiline — ^ и $ привязаны к границам строк, не всего текста |
u | unicode — корректная работа с суррогатными парами и \u{...} |
s | dotAll — . захватывает перевод строки |
y | sticky — поиск только с 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, а когда нет #
| Задача | Подход |
|---|---|
Есть ли подстрока express | str.includes('express') |
| Заменить одно слово | str.replace('руб', '₽') |
SKU строго XX-NN-XXX | regex с якорями ^ $ |
| Извлечь все суммы из чека | 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 — для структурированных форматов.