Callback in de replace methode in JavaScript regex
De replace methode kan als tweede parameter niet alleen een string accepteren, maar ook een callback-functie, die voor elke gevonden overeenkomst wordt toegepast. Elke substring die door de regex wordt gevonden, wordt vervangen door wat deze functie specifiek voor die substring teruggeeft.
Aan deze functie kunnen parameters worden doorgegeven: in de eerste parameter komt de gevonden string, in de tweede parameter - de eerste capture group, in de derde parameter - de tweede capture group en zo verder - je kunt zoveel parameters maken als er capture groups in de reguliere expressie zijn.
In de voorlaatste parameter komt de positie van de gevonden overeenkomst, en in de laatste - de gehele string waarop wordt gezocht.
Hoe dit allemaal werkt - laten we bekijken met praktische voorbeelden.
Voorbeeld
Stel we hebben een string met getallen:
let str = '2 3 4 5';
Laten we deze getallen vervangen door hun kwadraten. Laten we eerst onze getallen simpelweg een voor een in de console uitvoeren in de callback-functie:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Onze code zal eerst '2' uitvoeren, daarna
'3', '4' en '5'. Dat betekent
dat in de variabele match achtereenvolgens
de strings terechtkomen die de regex heeft gevonden.
Laten we de taak volledig oplossen - we zullen
match kwadrateren en teruggeven
met return. Het resultaat is dat voor de gevonden
twee 4 wordt teruggegeven en de twee wordt vervangen
door deze vier, voor de gevonden drie wordt 9 teruggegeven
en de drie wordt vervangen door deze negen
- en zo verder:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // geeft '4 9 16 25' weer
Voorbeeld
Stel dat er nu in de string constructies zijn van het type
'2+3=':
let str = '2+3= 4+5= 6+7=';
Laten we ervoor zorgen dat na het is-gelijk-teken de som van de corresponderende getallen wordt ingevoegd. Dat betekent dat onze string moet veranderen in het volgende:
'2+3=5 4+5=9 6+7=13'
Laten we om de taak op te lossen weer experimenteren - we splitsen de eerste en tweede term in aparte capture groups:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
En nu lossen we de taak definitief op: voor elke
gevonden substring tellen we de eerste en
tweede capture group op, nemen we de nulde capture group (de gevonden
string, bijvoorbeeld '2+3='), voegen we
daar het resultaat aan toe en geven we 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);
Praktische taken
Gegeven een string:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Vind de getallen tussen haakjes en vergroot ze twee keer. Dat betekent dat uit onze string de volgende moet ontstaan:
'aaa [4] bbb [6] ccc [24] ddd'
Gegeven een string:
let str = '123 456 789';
Vind alle getallen en draai hun cijfers om in omgekeerde volgorde. Dat betekent dat uit onze string de volgende moet ontstaan:
'321 654 987'
Gegeven een string met data:
let str = '31.12.2025 30.11.2024 29.10.2023';
Vind alle data en converteer ze naar een ander formaat zodat de volgende string ontstaat:
'2025-12-31 2024-11-30 2023-10-29'