ДокументацияJavaScriptРегулярные выражения в JavaScript: основы и частые паттерны
Средний 10 мин чтения

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

Регулярные выражения (RegExp) в JavaScript — синтаксис, методы test/exec, замена и поиск, частые паттерны: email, телефон, URL, пароль,_digit, пробелы.

регулярные выраженияRegExpregexрегуляркаmatchreplaceпаттерныJavaScript

Что такое регулярное выражение

Регулярное выражение (RegExp) — это шаблон для поиска и замены текста. Создаётся через литерал /pattern/ или конструктор new RegExp():

const literal = /hello/
const constructed = new RegExp('hello')

Конструктор удобен, когда паттерн формируется динамически:

const word = 'JavaScript'
const regex = new RegExp(word, 'gi')

Флаги

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

ФлагОписание
gглобальный — ищет все совпадения, а не только первое
iнечувствительный к регистру
mмногострочный — ^ и $ привязаны к строкам, а не к тексту целиком
sdotAll — . захватывает \n
uUnicode — корректная работа с Unicode-символами
/hello/gi     // глобальный + нечувствительный к регистру
/test/gimu    // можно комбинировать

Методы RegExp

test — есть ли совпадение

Возвращает true/false:

/hello/.test('hello world') // true
/hello/.test('Привет мир')  // false

// Email
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('anna@mail.ru') // true
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('не email')      // false

exec — найти совпадение с деталями

const match = /(\d{4})-(\d{2})-(\d{2})/.exec('Сегодня 2025-01-15')

match[0]  // '2025-01-15' — полное совпадение
match[1]  // '2025'       — первая группа
match[2]  // '01'         — вторая группа
match[3]  // '15'         — третья группа
match.index // 9          — позиция совпадения

Методы строки с RegExp

match — найти все совпадения

'2025-01-15 и 2024-12-31'.match(/\d{4}-\d{2}-\d{2}/g)
// ['2025-01-15', '2024-12-31']

'без дат тут'.match(/\d{4}/) // null

matchAll — итератор по всем совпадениям с группами

const text = '2025-01-15 и 2024-12-31'
const matches = [...text.matchAll(/(\d{4})-(\d{2})-(\d{2})/g)]

matches[0][1] // '2025'
matches[1][1] // '2024'

replace и replaceAll — замена

'Иванов Иван'.replace(/Иван/, 'Петр') // 'Петров Иван'
'Иванов Иван'.replace(/Иван/g, 'Петр') // 'Петров Петр'
'Иванов Иван'.replaceAll('Иван', 'Петр') // 'Петров Петр'

// С функцией замены
'цена: 100, 200, 300'.replace(/\d+/g, (match) => `$${match}`)
// 'цена: $100, $200, $300'

search — индекс первого совпадения

'abc123'.search(/\d/) // 3
'abc'.search(/\d/)    // -1

split — разделить строку

'яблоко, банан; груша'.split(/[,;]\s*/) // ['яблоко', 'банан', 'груша']
'2025-01-15'.split(/-/) // ['2025', '01', '15']

Синтаксис: основы

Специальные символы

СимволОписание
.любой символ (кроме \n, без флага s)
\dцифра [0-9]
\Dне цифра [^0-9]
\wбуква, цифра или _ [a-zA-Z0-9_]
\Wне \w
\sпробельный символ (пробел, таб, перенос)
\Sне пробельный
\bграница слова
^начало строки
$конец строки

Квантификаторы (сколько раз)

КвантификаторОписание
*0 или более
+1 или более
?0 или 1 (опционально)
{n}ровно n
{n,}n или более
{n,m}от n до m
/\d+/.test('123')     // true — одна или более цифр
/\d{3}/.test('12')    // false — нужно ровно 3
/\d{2,4}/.test('123') // true — от 2 до 4

Группы и классы

// Класс — один из перечисленных
/[aeiou]/.test('a')  // true
/[a-z]/.test('Z')    // false (маленькие только)

// Группа
/(ab)+/.test('abab') // true — «ab» повторяется

// Именованная группа
const match = /(?<year>\d{4})-(?<month>\d{2})/.exec('2025-01')
match.groups.year  // '2025'
match.groups.month // '01'

Escape-символ

Специальные символы нужно экранировать \:

/price: \$10/.test('price: $10') // true
/file\.js/.test('file.js')       // true

Частые паттерны

Email

const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
emailRegex.test('anna@mail.ru')  // true
emailRegex.test('не email')      // false
emailRegex.test('a@b')           // false

Телефон (российский формат)

const phoneRegex = /^(\+7|8)[\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}$/
phoneRegex.test('+7 (999) 123-45-67') // true
phoneRegex.test('89991234567')         // true

URL

const urlRegex = /^https?:\/\/[^\s/$.?#].[^\s]*$/
urlRegex.test('https://example.com/path') // true
urlRegex.test('не url')                   // false

Пароль (минимум 8 символов, буква + цифра)

const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/
passwordRegex.test('Password1') // true
passwordRegex.test('pass')      // false

Только цифры

/^\d+$/.test('12345')  // true
/^\d+$/.test('12a3')   // false

Удалить все HTML-теги

const html = '<p>Привет</p><b>Мир</b>'
const text = html.replace(/<[^>]*>/g, '') // 'ПриветМир'

CamelCase → kebab-case

'myComponentName'
  .replace(/([A-Z])/g, '-$1')
  .toLowerCase()
// 'my-component-name'

Обрезать лишние пробелы внутри текста

'  много   пробелов   тут  '.replace(/\s+/g, ' ').trim()
// 'много пробелов тут'

Именованные группы

const pattern = /(?<host>https?:\/\/[^/]+)(?<path>\/[^\?]*)\??(?<query>.*)/
const { groups } = pattern.exec('https://api.example.com/users?page=1&limit=10')

groups.host   // 'https://api.example.com'
groups.path   // '/users'
groups.query  // 'page=1&limit=10'

Итог

  • test() — проверить, есть ли совпадение
  • match() / matchAll() — найти совпадения в строке
  • replace() — заменить по паттерну
  • Флаг g — все совпадения, i — без учёта регистра
  • Спецсимволы (\d, \w, \s, ., ^, $) и квантификаторы (+, *, ?, {n,m}) — основа
  • Для сложных валидаций (email, URL) RegExp полезен, но не пытайтесь покрыть все краевые случаи — лучше валидировать на сервере