Callback în metoda replace în expresiile regulate JavaScript
Metoda replace poate accepta ca al doilea parametru nu doar un șir, ci și o funcție-callback, care se va aplica pentru fiecare potrivire găsită. Fiecare subșir, pe care l-a găsit expresia regulată, va fi înlocuit cu ceea ce returnează această funcție pentru acel subșir.
În această funcție pot fi transmise parametri: în primul parametru va fi pus șirul găsit, în al doilea parametru - prima grupă de captură, în al treilea parametru - a doua grupă de captură și așa mai departe - se pot face câți parametri, câte grupuri de captură sunt în expresia regulată.
În penultimul parametru va fi pusă poziția potrivirii găsite, iar în ultimul - întregul șir, pe care se face căutarea.
Cum funcționează toate acestea - vom analiza pe exemple practice.
Exemplu
Să fie dat un șir cu numere:
let str = '2 3 4 5';
Să înlocuim aceste numere cu pătratele lor. Pentru început, să afișăm numerele noastre pe rând în consolă în funcția-callback:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Codul nostru va afișa mai întâi '2', apoi
'3', '4' și '5'. Adică
în variabila match intră succesiv
acele șiruri, pe care le-a găsit expresia regulată.
Să rezolvăm problema până la capăt - vom ridica
match la pătrat și îl vom returna
cu ajutorul return. Se va întâmpla ca pentru cifra doi găsită
să se returneze 4 și doi se va înlocui
cu acest patru, pentru cifra trei găsită se va returna
9 și trei se va înlocui cu acest nouă
- și așa mai departe:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // va afișa '4 9 16 25'
Exemplu
Să fie acum în șir date construcții de forma
'2+3=':
let str = '2+3= 4+5= 6+7=';
Să facem astfel încât după egal să fie inserate sumele numerelor corespunzătoare. Adică șirul nostru ar trebui să se transforme în următorul:
'2+3=5 4+5=9 6+7=13'
Pentru rezolvarea problemei să experimentăm din nou - să distribuim primul și al doilea termen în grupuri de captură separate:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
Și acum să rezolvăm problema final: pentru fiecare
subșir găsit să însumăm prima și
a doua grupă de captură, să luăm grupa zero (șirul găsit,
de exemplu '2+3='), să adăugăm
la el rezultatul și să returnăm toate acestea prin return:
let result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
let sum = Number(match1) + Number(match2);
return match0 + sum;
});
console.log(result);
Probleme practice
Este dat un șir:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Găsiți numerele, care stau în paranteze și măriți-le de două ori. Adică din șirul nostru ar trebui să rezulte următorul:
'aaa [4] bbb [6] ccc [24] ddd'
Este dat un șir:
let str = '123 456 789';
Găsiți toate numerele și întoarceți-le cifrele în ordine inversă. Adică din șirul nostru ar trebui să rezulte următorul:
'321 654 987'
Este dat un șir cu date:
let str = '31.12.2025 30.11.2024 29.10.2023';
Găsiți toate datele și transformați-le în alt format astfel încât să rezulte următorul șir:
'2025-12-31 2024-11-30 2023-10-29'