Методы для работы с 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-код становится хрупким.