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:

javascriptlet 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:

javascriptstr.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:

javascriptlet 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=':

javascriptlet 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:

javascript'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:

javascriptstr.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:

javascriptlet result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
  let sum = Number(match1) + Number(match2);
  return match0 + sum;
});

console.log(result);

Problemi pratici

Задание 1

Data una stringa:

javascriptlet str = 'aaa [2] bbb [3] ccc [12] ddd';

Trova i numeri tra parentesi e raddoppiali. Cioè dalla nostra stringa dovrebbe risultare la seguente:

javascript'aaa [4] bbb [6] ccc [24] ddd'
Задание 2

Data una stringa:

javascriptlet str = '123 456 789';

Trova tutti i numeri e inverti le loro cifre in ordine inverso. Cioè dalla nostra stringa dovrebbe risultare la seguente:

javascript'321 654 987'
Задание 3

Data una stringa con date:

javascriptlet 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:

javascript'2025-12-31 2024-11-30 2023-10-29'