Callback in die replace metode in JavaScript regex
Die replace metode kan as tweede parameter nie net 'n string nie, maar ook 'n callback-funksie aanvaar, wat vir elke gevonde ooreenkoms toegepas sal word. Elke substring wat die regex vind, sal vervang word deur wat hierdie funksie spesifiek vir daardie substring teruggee.
Aan hierdie funksie kan parameters oorgedra word: in die eerste parameter sal die gevonde string geplaas word, in die tweede parameter - die eerste vanggroep, in die derde parameter - die tweede vanggroep ensovoorts - jy kan soveel parameters maak as wat daar vangroepe in die reguliere uitdrukking is.
In die voorlaaste parameter sal die posisie van die gevonde ooreenkoms geplaas word, en in die laaste een - die hele string waarop die soektog gedoen word.
Hoe dit alles werk - sal ons aan praktiese voorbeelde ondersoek.
Voorbeeld
Laat daar 'n string met getalle gegee wees:
let str = '2 3 4 5';
Kom ons vervang hierdie getalle met hul kwadrate. Om te begin, laat ons net ons getalle een vir een in die konsole uitvoer in die callback-funksie:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Ons kode sal eers '2' uitvoer, dan
'3', '4' en '5'. Dit wil sê
die veranderlike match ontvang agtereenvolgens
daardie strings wat die regex gevind het.
Laat ons die probleem tot die einde oplos - ons sal
match kwadreer en dit teruggee met
return. Dan sal gebeur dat vir die gevonde
twee, 4 teruggegee word en die twee deur
hierdie vier vervang word, vir die gevonde drie sal
9 teruggegee word en die drie deur hierdie nege vervang word - ensovoorts:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // sal '4 9 16 25' uitvoer
Voorbeeld
Laat daar nou in die string konstruksies van die vorm
'2+3=' gegee wees:
let str = '2+3= 4+5= 6+7=';
Laat ons dit so maak dat die somme van die ooreenstemmende getalle na die gelykant ingevoeg word. Dit wil sê ons string moet in die volgende verander:
'2+3=5 4+5=9 6+7=13'
Om die probleem op te los, laat ons weer eksperimenteer - laat ons die eerste en tweede term in afsonderlike vangroepe plaas:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
En laat ons nou die probleem finaal oplos: vir elke
gevonde substring, som ons die eerste en
tweede vangroep op, neem die nulde vangroep (die gevonde string, byvoorbeeld '2+3='), voeg die resultaat daaraan en gee dit alles terug via return:
let result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
let sum = Number(match1) + Number(match2);
return match0 + sum;
});
console.log(result);
Praktiese probleme
Daar word 'n string gegee:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Vind die getalle tussen hakies en verdubbel hulle. Dit wil sê uit ons string moet die volgende ontstaan:
'aaa [4] bbb [6] ccc [24] ddd'
Daar word 'n string gegee:
let str = '123 456 789';
Vind alle getalle en draai hulle syfers in die omgekeerde volgorde om. Dit wil sê uit ons string moet die volgende ontstaan:
'321 654 987'
Daar word 'n string met datums gegee:
let str = '31.12.2025 30.11.2024 29.10.2023';
Vind alle datums en omskep hulle in 'n ander formaat sodat die volgende string ontstaan:
'2025-12-31 2024-11-30 2023-10-29'