Регулярные выражения
Элементы, квантификаторы, группы, флаги и когда не стоит использовать regex.
Обновлено
Что такое регулярное выражение
Регулярное выражение (regex) — это шаблон, который описывает, как выглядит текст: «начинается с заглавной буквы», «содержит номер телефона», «это индекс из 6 цифр». С его помощью можно проверять, искать, извлекать и заменять фрагменты текста.
/^\d{6}$/.test('101000') // true — ровно 6 цифр
'Tel: 0722 123 456'.match(/\d+/g) // ['0722', '123', '456']
'a-b-c'.replace(/-/g, ' ') // 'a b c'Поначалу выглядит загадочно, но это всего несколько элементов в комбинации.
Базовые элементы
| Элемент | Совпадает с | Пример |
|---|---|---|
abc |
ровно этим текстом | /cat/ |
. |
любым символом (кроме перевода строки) | /c.t/ → cat, cut |
\d / \w / \s |
цифрой / буквой-цифрой-подчёркиванием / пробельным символом | /\d\d/ |
[abc] / [a-z] / [^0-9] |
одним из набора / диапазоном / чем угодно, кроме | /[aeiou]/ |
^ / $ |
началом / концом текста | /^Hello/ |
\b |
границей слова | /\bvar\b/ |
\. \? \( |
спецсимволами как текстом | /\.js$/ |
Квантификаторы — сколько раз
| Квантификатор | Означает |
|---|---|
? |
0 или 1 (необязательно) |
* |
0 или больше |
+ |
1 или больше |
{3} / {2,4} / {2,} |
ровно 3 / от 2 до 4 / минимум 2 |
По умолчанию они жадные (берут как можно больше); с ? после них становятся ленивыми: /<.+?>/ останавливается на первом >.
Группы
const m = '2026-10-08'.match(/(\d{4})-(\d{2})-(\d{2})/)
m[1] // '2026'
const { groups } = '2026-10-08'.match(/(?<year>\d{4})-(?<month>\d{2})/)
groups.year // '2026' — именованные группы читаются лучше
/(?:ab)+/ // группа без захвата — только чтобы применить + к «ab»
/cat|dog/ // альтернативаФлаги
| Флаг | Эффект |
|---|---|
g |
все совпадения, а не только первое |
i |
без учёта регистра |
m |
^ и $ на каждой строке |
u |
корректный Unicode (диакритика, кириллица, emoji) — используйте по умолчанию |
Методы — что и когда
| Нужно | Метод |
|---|---|
| да / нет | regex.test(str) |
| первое совпадение + группы | str.match(regex) (без g) |
| все совпадения с группами | [...str.matchAll(/.../g)] |
| замена | str.replace(regex, 'x') / replaceAll / с функцией: replace(re, m => ...) |
| разбиение | str.split(/\s*,\s*/) |
Когда regex не нужен
- Полностью корректный email — практически невозможно; используйте
type="email"/z.email(). - HTML / JSON — используйте парсер (
DOMParser,JSON.parse). - URL —
new URL(). - Огромные regex, которые никто уже не может прочитать, — лучше несколько простых проверок.
Коротко
- Regex = шаблон текста: элементы (
\d,[a-z],^ $) + квантификаторы (+ * ? {n}) + группы. testдля да/нет,matchAllдля извлечения,replaceдля замены; флагиg i u.- Для email, HTML, URL используйте специальные инструменты.