Callback i replace-metoden i JavaScript regex
Replace-metoden kan ta ikke bare en streng, men også en callback-funksjon som andre parameter, som vil bli brukt for hvert funnet treff. Hver delstreng som regexen finner, vil bli erstattet med det denne funksjonen returnerer for nettopp denne delstrengen.
Til denne funksjonen kan parametere sendes: i den første parameteren vil den funnete strengen legges, i den andre parameteren - den første fangstgruppen, i den tredje parameteren - den andre fangstgruppen og så videre - du kan lage like mange parametere som det er fangstgrupper i det regulære uttrykket.
I den nest siste parameteren vil posisjonen til det funne treffet legges, og i den siste - hele strengen det søkes i.
Hvordan alt dette fungerer - vil vi gå gjennom med praktiske eksempler.
Eksempel
La det være gitt en streng med tall:
let str = '2 3 4 5';
La oss erstatte disse tallene med deres kvadrater. La oss først bare skrive ut tallene våre en etter en i konsollen i callback-funksjonen:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Koden vår vil først skrive ut '2', deretter
'3', '4' og '5'. Det vil si
at i variabelen match havner de
strengene som regexen fant, sekvensielt.
La oss løse oppgaven fullstendig - vi vil opphøye
match i andre potens og returnere den
med return. Det vil bli slik at for den funnete
toeren returneres 4 og toeren erstattes
med denne fireren, for den funnete treeren returneres
9 og treeren erstattes med denne nieren
- og så videre:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // skriver ut '4 9 16 25'
Eksempel
La det nå i strengen være gitt konstruksjoner av typen
'2+3=':
let str = '2+3= 4+5= 6+7=';
La oss gjøre slik at det etter likhetstegn settes inn summene av de tilsvarende tallene. Det vil si at vår streng skal bli til følgende:
'2+3=5 4+5=9 6+7=13'
For å løse oppgaven, la oss eksperimentere igjen - la oss legge det første og andre leddet i separate fangstgrupper:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
Og la oss nå endelig løse oppgaven: for hver
funnet delstreng, la oss summere den første og
andre fangstgruppen, ta den nullte fangstgruppen (den funne
strengen, for eksempel '2+3='), legge til
den til resultatet og returnere alt dette 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);
Praktiske oppgaver
Det er gitt en streng:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Finn tallene som står i parentes og øk dem to ganger. Det vil si at fra vår streng skal følgende bli resultatet:
'aaa [4] bbb [6] ccc [24] ddd'
Det er gitt en streng:
let str = '123 456 789';
Finn alle tallene og reverser sifrene deres i omvendt rekkefølge. Det vil si at fra vår streng skal følgende bli resultatet:
'321 654 987'
Det er gitt en streng med datoer:
let str = '31.12.2025 30.11.2024 29.10.2023';
Finn alle datoer og transformer dem til et annet format slik at følgende streng blir resultatet:
'2025-12-31 2024-11-30 2023-10-29'