Колбек у методу 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'