Callback в метода replace в регулярни изрази на JavaScript

Методът replace може да приема като втори параметър не само низ, но и функция-callback, която ще се приложи за всеки намерен съвпадение. Всеки подниз, който регулярният израз намери, ще бъде заменен с това, което върне тази функция именно за този подниз.

В тази функция могат да се подават параметри: в първия параметър ще се постави намереният низ, във втория параметър - първата група (capturing group), в третия параметър - втората група и така нататък - може да се направят толкова параметри, колкото групи има в регулярния израз.

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

Как работи всичко това - ще разгледаме с практически примери.

Пример

Нека е даден низ с числа:

javascriptlet str = '2 3 4 5';

Нека заменим тези числа с техните квадрати. Като начало нека просто да изведем числата ни едно по едно в конзолата във функцията-callback:

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

Нашият код първо ще изведе '2', после '3', '4' и '5'. Тоест в променливата match последователно попадат те низове, които регулярният израз намери.

Нека решим задачата до край - ще повдигаме match на квадрат и ще го връщаме с помощта на return. Ще се получи, че за намерената двойка ще се върне 4 и двойката ще се замени на тази четворка, за намерената тройка ще се върне 9 и тройката ще се замени на тази девятка - и така нататък:

javascriptlet result = str.replace(/\d+/g, function (match) {
  return match**2; 
});

console.log(result); // ще изведе '4 9 16 25'

Пример

Нека сега в низа са дадени конструкции от вида '2+3=':

javascriptlet str = '2+3= 4+5= 6+7=';

Нека направим така, че след равно да се вмъкнат сумите на съответните числа. Тоест нашият низ трябва да се превърне в следния:

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

За решаване на задачата нека отново да експериментираме - да разделим първото и второто събираеми по отделни групи:

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

А сега окончателно да решим задачата: за всяка намерена подстрока да съберем първата и втората група, да вземем нулевата група (намерения низ, например '2+3='), да добавим към него резултата и да върнем всичко това чрез return:

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

console.log(result);

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

Задание 1

Даден е низ:

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

Намерете числата, стоящи в скоби и ги увеличете по два пъти. Тоест от нашия низ трябва да се получи следният:

javascript'aaa [4] bbb [6] ccc [24] ddd'
Задание 2

Даден е низ:

javascriptlet str = '123 456 789';

Намерете всички числа и обърнете цифрите им в обратен ред. Тоест от нашия низ трябва да се получи следният:

javascript'321 654 987'
Задание 3

Даден е низ с дати:

javascriptlet str = '31.12.2025 30.11.2024 29.10.2023';

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

javascript'2025-12-31 2024-11-30 2023-10-29'