# Коллбэк в методе replace в регулярках JavaScript

Метод replace вторым параметром может принимать не только строку, но и функцию-коллбэк, которая применится для каждого найденного совпадения. Каждая подстрока, которую нашла регулярка, заменится на то, что вернет эта функция именно для этой подстроки.

В эту функцию можно передавать параметры: в первый параметр положится найденная строка, во второй параметр - первый карман, в третий параметр - второй карман и так далее - можно делать сколько параметров, сколько карманов в регулярном выражении.

В предпоследний параметр положится позиция найденного совпадения, а в последний - вся строка, по которой делается поиск.

Как это все работает - разберем на практических примерах.

## Пример

Пусть дана строка с числами:

`let str = '2 3 4 5';`

Давайте заменим эти числа на их квадраты. Для начала давайте просто выведем наши числа по очереди в консоль в функции-коллбэке:

`str.replace(/\d+/g, function(match) { console.log(match); });`

Наш код выведет сначала `'2'`, потом `'3'`, `'4'` и `'5'`. То есть в переменную `match` последовательно попадают те строки, которые нашла регулярка.

Давайте решим задачу до конца - будем возводить `match` в квадрат и возвращать его с помощью `return`. Получится, что для найденной двойки вернется `4` и двойка заменится на эту четверку, для найденной тройки вернется `9` и тройка заменится на эту девятку - и так далее:

`let result = str.replace(/\d+/g, function (match) { return match**2; }); console.log(result); // выведет '4 9 16 25'`

## Пример

Пусть теперь в строке даны конструкции вида `'2+3='`:

`let str = '2+3= 4+5= 6+7=';`

Давайте сделаем так, чтобы после равно вставились суммы соответствующих чисел. То есть наша строка должна превратиться в следующую:

`'2+3=5 4+5=9 6+7=13'`

Для решения задачи давайте опять поэкспериментируем - разложим первое и второе слагаемые по отдельным карманам:

`str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) { console.log(match0, match1, match2); });`

А теперь окончательно решим задачу: для каждой найденной подстроки просуммируем первый и второй карманы, возьмем нулевой карман (найденную строку, например `'2+3='`), добавим к нему результат и вернем все это через `return`:

`let result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) { let sum = Number(match1) + Number(match2); return match0 + sum; }); console.log(result);`

## Практические задачи

Дана строка:

`let str = 'aaa [2] bbb [3] ccc [12] ddd';`

Найдите числа, стоящие в скобках и увеличьте их в два раза. То есть из нашей строки должна получится следующая:

`'aaa [4] bbb [6] ccc [24] ddd'`

Дана строка:

`let str = '123 456 789';`

Найдите все числа и переверните их цифры в обратном порядке. То есть из нашей строки должна получится следующая:

`'321 654 987'`

Дана строка с датами:

`let str = '31.12.2025 30.11.2024 29.10.2023';`

Найдите все даты и преобразуйте их в другой формат так, чтобы получилась следующая строка:

`'2025-12-31 2024-11-30 2023-10-29'`
←→
↑
en ru