Метод 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'