Методы для работы с regex в JavaScript
Методы для работы с regex в JavaScript
Технический фундамент API-методов regex
Для надежной работы важно различать источники методов:
RegExp.prototype:test,exec;String.prototype:match,replace,split,search.
Также учитывай, что regex с флагом g хранит внутреннее состояние (lastIndex) для exec/test в некоторых сценариях. Это может менять результат повторных вызовов.
Почему важно знать именно методы
Сам по себе шаблон regex ничего не делает, пока ты не применишь его через метод. В JavaScript есть методы у RegExp и у String, и они решают разные задачи: проверить, найти, извлечь, заменить, разделить.
Ключевой момент: один и тот же regex может вести себя по-разному в зависимости от метода.
Проверь себя: почему для проверки формата логичнее test, а не replace?
test() - быстрый ответ true/false
Метод RegExp.test(str) проверяет, есть ли совпадение.
const emailLike = /@/;
console.log(emailLike.test('user@mail.com')); // true
console.log(emailLike.test('usermail.com')); // false
Это базовый инструмент для простых валидаций.
Смотри, что важно: test не возвращает само совпадение, только булево значение.
Смотри, что важно: не используй флаг g вместе с test() для повторных проверок одним и тем же regex. Из-за lastIndex результат может "скакать".
const r = /\d/g;
console.log(r.test('A1')); // true
console.log(r.test('A1')); // false (поиск продолжился после найденного символа)
console.log(r.test('A1')); // true (lastIndex сбросился после неудачи)
Анти-провал: для валидации формата чаще нужен regex без g (со строгими ^...$), а g оставляют для поиска/извлечения множества совпадений.
match() - получить совпадения из строки
String.match(regex) возвращает массив совпадений или null.
const text = 'Order #123, Order #456';
console.log(text.match(/#\d+/g)); // ['#123', '#456']
Если флага g нет, match вернет первое совпадение с доп. информацией.
Здесь часто путаются: поведение match зависит от флагов regex.
Смотри, что важно: если нужно получить все совпадения и при этом читать группы, match(/.../g) не даст группы. Для этого в JS есть matchAll.
const text = '15.09.2025 and 16.09.2025';
const r = /(\d{2})\.(\d{2})\.(\d{4})/g;
for (const m of text.matchAll(r)) {
console.log(m[1], m[2], m[3]);
}
replace() - заменить по шаблону
String.replace(regex, replacement) заменяет совпадение(я).
const raw = 'Телефон: 380501112233';
const hidden = raw.replace(/\d/g, '*');
console.log(hidden); // Телефон: ************
Мини-сценарий: маскировать персональные данные перед логированием.
Можно использовать функцию-заменитель для более гибкой логики.
const formatted = '2025-09-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1');
console.log(formatted); // 15.09.2025
split() - разделить строку по regex
String.split(regex) полезен, когда разделители бывают разными.
const tags = 'js,ts;node react';
console.log(tags.split(/[;,\s]+/)); // ['js', 'ts', 'node', 'react']
Смотри, что важно: regex в split часто удобнее, чем несколько последовательных replace.
search() - позиция первого совпадения
String.search(regex) возвращает индекс первого совпадения или -1, если ничего не найдено.
const text = 'Order #123, Order #456';
console.log(text.search(/#\d+/)); // 6
console.log(text.search(/#\d{5}/)); // -1
exec() - пошаговый разбор совпадений
RegExp.exec(str) возвращает следующее совпадение. Особенно полезно при флаге g и пошаговом анализе.
const regex = /#\d+/g;
const text = 'id #1 and #2';
let match;
while ((match = regex.exec(text)) !== null) {
console.log(match[0], match.index);
}
Дополнительный пример: безопасная обработка match, когда совпадений может не быть.
const matches = 'no ids here'.match(/#\d+/g) ?? [];
console.log(matches.length); // 0
Новый термин: index совпадения - позиция, где найден шаблон в строке.
Частые ошибки новичков
- Ждать от
testнайденного текста, а неtrue/false. - Забывать флаг
gи получать только первое совпадение. - Неправильно использовать группы в
replace. - Не обрабатывать
nullпослеmatch.
Анти-провал: всегда проверяй тип результата метода (boolean, array, string), чтобы не ловить TypeError в следующей строке.
Что будет, если изменить входные данные
Для text.match(/#\d+/g):
- в строке с
#123получишь массив совпадений; - если нет ни одного
#число, получишьnull.
Если сразу вызвать .length на null, код упадет. Значит, нужна защитная проверка.
Проверь себя: какой безопасный шаблон проверки перед matches.length?
Краткий итог
test- быстрый boolean-ответ о совпадении.matchиexec- инструменты извлечения совпадений.replaceиsplit- практические методы трансформации текста.- Флаги regex сильно влияют на результат методов.
- Без проверки edge case (
null, пустая строка, отсутствующие совпадения) regex-код становится хрупким.