Средний 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 | многострочный — ^ и $ привязаны к строкам, а не к тексту целиком |
s | dotAll — . захватывает \n |
u | Unicode — корректная работа с 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
Частые паттерны
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 полезен, но не пытайтесь покрыть все краевые случаи — лучше валидировать на сервере