⊗jsSpRERMC 127 of 294 menu

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'
itdamsfrtr