JS / Основы
Символы регулярных выражений в JavaScript: справочник с примерами
Метасимволы, классы, квантификаторы, группы, границы, lookaround и флаги JavaScript RegExp в компактном справочнике.
Содержание статьи
Регулярное выражение состоит из обычных символов и метасимволов со специальным значением. Этот справочник помогает читать шаблон, но не заменяет тесты: один символ может вести себя по-разному в зависимости от класса, флага и контекста.
Обычный текст и экранирование
const pattern = /cat/;pattern.test('black cat'); // trueСпециальные символы ^ $ \\ . * + ? ( ) [ ] { } | / нужно экранировать обратным слешем, если они означают самих себя:
const filenamePattern = /^report\.pdf$/;const pricePattern = /^\d+\$$/;В regex-литерале / тоже экранируется: /https:\/\//. В строке для new RegExp() обратный слеш приходится экранировать второй раз.
Точка и символьные классы
| Запись | Значение |
|---|---|
. |
любой символ, кроме перевода строки без флага s |
\d |
цифра ASCII 0–9 |
\D |
не \d |
\w |
ASCII-буква, цифра или _ |
\W |
не \w |
\s |
пробельный символ |
\S |
не \s |
/c.t/.test('cat'); // true/\d{3}/.test('Код 404'); // true\w не охватывает кириллицу. Для букв разных письменностей:
const letters = /^\p{L}+$/u;letters.test('Привет'); // trueletters.test('Hello'); // trueUnicode property escapes работают с флагом u или v.
Квадратные скобки
Класс выбирает один символ из набора:
/[aeiou]/i.test('Sky'); // false/[0-9a-f]/i.test('F'); // true/[^0-9]/.test('123a'); // true[abc]—a,bилиc;[a-z]— диапазон;[^abc]— любой символ, кроме перечисленных.
Дефис лучше ставить в начало или конец класса либо экранировать, если он должен быть буквальным. Символ ^ означает отрицание только сразу после [.
Квантификаторы
| Запись | Количество предыдущего элемента |
|---|---|
* |
0 или больше |
+ |
1 или больше |
? |
0 или 1 |
{n} |
ровно n |
{n,} |
не меньше n |
{n,m} |
от n до m |
/^a*$/.test(''); // true/^a+$/.test('aaa'); // true/^colou?r$/.test('color'); // true/^\d{2,4}$/.test('2026'); // trueКвантификатор относится только к предыдущему атому. Для повторения последовательности нужна группа:
/^(ha){2,3}$/.test('hahaha'); // trueЖадность
Квантификаторы по умолчанию захватывают максимально возможный фрагмент:
const text = '<b>один</b><b>два</b>';text.match(/<b>.*<\/b>/)?.[0]; // Вся строка.text.match(/<b>.*?<\/b>/)?.[0]; // Первый элемент.*?, +?, ?? и {n,m}? делают квантификатор ленивым. Но HTML не следует полноценно разбирать regex: для реальной разметки используйте DOMParser.
Группы
const match = '2026-08'.match(/^(\d{4})-(\d{2})$/);console.log(match?.[1]); // '2026'console.log(match?.[2]); // '08'Виды групп:
(abc)— сохраняющая группа;(?:abc)— несохраняющая;(?<name>abc)— именованная;\1— обратная ссылка по номеру;\k<name>— именованная обратная ссылка.
const quotePattern = /(?<quote>['"])(?<text>.*?)\k<quote>/;JavaScript не поддерживает комментарии вида (?# текст) внутри регулярного выражения. Сложный шаблон документируйте обычным комментарием рядом или собирайте из понятных частей.
Альтернатива
/^(cat|dog)$/.test('dog'); // true| имеет низкий приоритет. Скобки не дают якорям примениться только к одной ветке:
// Ошибочно для проверки всей строки: ^cat|dog$const animalPattern = /^(?:cat|dog)$/;Якоря и границы
| Запись | Значение |
|---|---|
^ |
начало строки, а с m — начало каждой строки |
$ |
конец строки, а с m — конец каждой строки |
\b |
граница слова по модели \w |
\B |
позиция не на границе слова |
/^START$/m.test('one\nSTART\nthree'); // true\b ориентируется на понятие \w и может давать неожиданные результаты для кириллицы и других письменностей. Для Unicode-задач описывайте соседние классы явно и тестируйте выбранные языки.
Lookahead и lookbehind
Проверка контекста без включения его в результат:
(?=...)— положительный lookahead;(?!...)— отрицательный lookahead;(?<=...)— положительный lookbehind;(?<!...)— отрицательный lookbehind.
const amountPattern = /\d+(?= ₽)/g;'100 ₽ и 25 $'.match(amountPattern); // ['100']Lookbehind поддерживается современными движками, но для старых окружений проверьте совместимость.
Основные флаги
const pattern = /hello/giu;g— глобальный поиск;i— без учёта регистра;m— многострочные якоря;s— dotAll;u— Unicode-режим;v— расширенные Unicode-наборы в поддерживающих окружениях;y— sticky-поиск с текущегоlastIndex;d— индексы границ совпадений.
Флаги g и y делают объект состоянием: test() и exec() меняют lastIndex.
Короткий пример разбора лога
const logPattern = /^(?<level>INFO|WARN|ERROR)\s+(?<code>[A-Z]+-\d{4})$/;const match = 'ERROR API-5001'.match(logPattern);if (match?.groups) { console.log(match.groups.level); // 'ERROR' console.log(match.groups.code); // 'API-5001'}Что запомнить
Читайте regex слева направо: якорь, допустимые символы, количество, группы и флаги. Экранируйте литеральные метасимволы, не считайте \w Unicode-словом и помните о состоянии g/y. Сложный шаблон разбивайте и покрывайте примерами.