Перейти к основному содержимому
Модуль 7 · Урок 3 из 427/32 в курсе~12 min
Уроки модуля (3/4)

Заменить обратным вызовом

Если строки замены недостаточно, передайте функцию: str.replace(regex, (match, ...groups) => string). Обратный вызов вызывается для каждого совпадения и его возвращаемое значение становится заменой.

JS
'prezzi: 10 20 30'.replace(/\d+/g, (m) => Number(m) * 1.22);
// "prezzi: 12.2 24.4 36.6" (22% VAT)

Аргументы обратного вызова

JS
str.replace(regex, (match, p1, p2, ..., offset, original, groups) => ...);
  • match -- всё совпадение.
  • p1, p2, \u2026 — захваченные группы по порядку.
  • offset -- индекс совпадения в исходной строке.
  • original -- вся строка.
  • groups -- объект с именованными группами (если есть).
JS
'2024-03-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, (_, a, m, g) => `${g}/${m}/${a}`);
// "15/03/2024"

Обратный вызов дает вам произвольные возможности: синтаксический анализ, поиск, преобразование, HTML. экранирование\u2026 всего, что не может сделать статическая строка.

Расширенные аргументы в обратных вызовах замены

Функция обратного вызова получает несколько аргументов: полное совпадение, каждую захваченную группу, смещение совпадения внутри всего текста и исходную входную строку. Это обеспечивает сложную логику преобразования на основе контекста.

Попробуйте это

Упражнение#regex.m7.l3.e1
Попыток: 0Загрузка…

Найдите каждое целое число в тексте. (Вместо замены вы должны передать `(m) => Number(m) * 2`, чтобы удвоить его.)

Загрузка редактора…
Показать подсказку

Используйте \\d+ (одну или несколько цифр), чтобы записать каждое целое число как одно совпадение.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#regex.m7.l3.e2
Попыток: 0Загрузка…

Найдите каждое электронное письмо (упрощенная форма: буквы/цифры/точки/подчеркивания @ домен). Таким образом, обратный вызов может изменить его на `***@domain`.

Загрузка редактора…
Показать подсказку

Расширьте класс до [\\w.]+, чтобы можно было использовать точки в имени пользователя и домене.

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#regex.m7.l3.e3
Попыток: 0Загрузка…

Match every word consisting of letters in the text, so it can be transformed to uppercase via a callback.

Загрузка редактора…
Показать подсказку

Найдите простые буквы с помощью [a-zA-Z]+.

Решение доступно после 3 попыток