Callback nel metodo replace delle espressioni regolari in JavaScript
Il metodo replace può accettare come secondo parametro non solo una stringa, ma anche una funzione di callback, che verrà applicata per ogni corrispondenza trovata. Ogni sottostringa trovata dall'espressione regolare sarà sostituita con ciò che questa funzione restituirà proprio per quella sottostringa.
In questa funzione è possibile passare parametri: nel primo parametro verrà inserita la stringa trovata, nel secondo parametro - la prima cattura (primo gruppo), nel terzo parametro - la seconda cattura (secondo gruppo) e così via - è possibile fare tanti parametri quante sono le catture nell'espressione regolare.
Nel penultimo parametro verrà inserita la posizione della corrispondenza trovata, e nell'ultimo - l'intera stringa in cui viene effettuata la ricerca.
Vediamo come funziona tutto questo con esempi pratici.
Esempio
Sia data una stringa con numeri:
let str = '2 3 4 5';
Sostituiamo questi numeri con i loro quadrati. Per cominciare, semplicemente stampiamo i nostri numeri uno per volta nella console nella funzione di callback:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Il nostro codice stamperà prima '2', poi
'3', '4' e '5'. Cioè
nella variabile match entrano sequenzialmente
le stringhe trovate dall'espressione regolare.
Risolviamo il problema fino alla fine - eleviamo
match al quadrato e restituiamolo
con return. Risulterà che per il 2 trovato
verrà restituito 4 e il 2 sarà sostituito
con questo 4, per il 3 trovato verrà restituito
9 e il 3 sarà sostituito con questo 9
- e così via:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // stamperà '4 9 16 25'
Esempio
Supponiamo ora che nella stringa ci siano costruzioni del tipo
'2+3=':
let str = '2+3= 4+5= 6+7=';
Facciamo in modo che dopo l'uguale vengano inserite le somme dei numeri corrispondenti. Cioè la nostra stringa dovrebbe trasformarsi nella seguente:
'2+3=5 4+5=9 6+7=13'
Per risolvere il problema, sperimentiamo ancora - separiamo il primo e il secondo addendo in gruppi (catture) separati:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
E ora risolviamo definitivamente il problema: per ogni
sottostringa trovata, sommiamo il primo e
il secondo gruppo, prendiamo il gruppo zero (la stringa
trovata, ad esempio '2+3='), aggiungiamo
ad esso il risultato e restituiamo tutto tramite return:
let result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
let sum = Number(match1) + Number(match2);
return match0 + sum;
});
console.log(result);
Problemi pratici
Data una stringa:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Trova i numeri tra parentesi e raddoppiali. Cioè dalla nostra stringa dovrebbe risultare la seguente:
'aaa [4] bbb [6] ccc [24] ddd'
Data una stringa:
let str = '123 456 789';
Trova tutti i numeri e inverti le loro cifre in ordine inverso. Cioè dalla nostra stringa dovrebbe risultare la seguente:
'321 654 987'
Data una stringa con date:
let str = '31.12.2025 30.11.2024 29.10.2023';
Trova tutte le date e convertile in un altro formato in modo da ottenere la seguente stringa:
'2025-12-31 2024-11-30 2023-10-29'