Callback в метода replace в регулярни изрази на JavaScript
Методът replace може да приема като втори параметър не само низ, но и функция-callback, която ще се приложи за всеки намерен съвпадение. Всеки подниз, който регулярният израз намери, ще бъде заменен с това, което върне тази функция именно за този подниз.
В тази функция могат да се подават параметри: в първия параметър ще се постави намереният низ, във втория параметър - първата група (capturing group), в третия параметър - втората група и така нататък - може да се направят толкова параметри, колкото групи има в регулярния израз.
В предпоследния параметър ще се постави позицията на намереното съвпадение, а в последния - целият низ, по който се извършва търсенето.
Как работи всичко това - ще разгледаме с практически примери.
Пример
Нека е даден низ с числа:
let str = '2 3 4 5';
Нека заменим тези числа с техните квадрати. Като начало нека просто да изведем числата ни едно по едно в конзолата във функцията-callback:
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'