Callback w metodzie replace w wyrażeniach regularnych JavaScript
Metod replace jako drugi parametr może przyjmować nie tylko ciąg znaków, ale także funkcję callback, która zostanie zastosowana dla każdego znalezionego dopasowania. Każdy podciąg, który znajdzie wyrażenie regularne, zostanie zastąpiony tym, co zwróci ta funkcja właśnie dla tego podciągu.
Do tej funkcji można przekazywać parametry: do pierwszego parametru trafi znaleziony ciąg znaków, do drugiego parametru - pierwsza grupa przechwytująca, do trzeciego parametru - druga grupa przechwytująca i tak dalej - można robić tyle parametrów, ile grup przechwytujących w wyrażeniu regularnym.
Do przedostatniego parametru trafi pozycja znalezionego dopasowania, a do ostatniego - cały ciąg znaków, po którym odbywa się wyszukiwanie.
Jak to wszystko działa - przeanalizujemy na praktycznych przykładach.
Przykład
Niech będzie dany ciąg znaków z liczbami:
let str = '2 3 4 5';
Zamieńmy te liczby na ich kwadraty. Na początek po prostu wypiszmy nasze liczby po kolei do konsoli w funkcji callback:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Nasz kod wypisze najpierw '2', potem
'3', '4' i '5'. To znaczy
do zmiennej match kolejno trafiają
te ciągi znaków, które znalazło wyrażenie regularne.
Rozwiążmy zadanie do końca - podnieśmy
match do kwadratu i zwróćmy go
za pomocą return. Okaże się, że dla znalezionej
dwójki zwrócone zostanie 4 i dwójka zostanie zastąpiona
tą czwórką, dla znalezionej trójki zwrócone zostanie
9 i trójka zostanie zastąpiona tą dziewiątką
- i tak dalej:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // wypisze '4 9 16 25'
Przykład
Niech teraz w ciągu znaków będą dane konstrukcje typu
'2+3=':
let str = '2+3= 4+5= 6+7=';
Sprawmy, żeby po znaku równości wstawione zostały sumy odpowiednich liczb. To znaczy nasz ciąg znaków powinien przekształcić się w następujący:
'2+3=5 4+5=9 6+7=13'
Aby rozwiązać zadanie, poeksperymentujmy ponownie - rozłóżmy pierwszą i drugą liczbę do oddzielnych grup przechwytujących:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
A teraz rozwiążmy zadanie ostatecznie: dla każdego
znalezionego podciągu zsumujmy pierwszą i
drugą grupę przechwytującą, weźmy zerową grupę (znaleziony
ciąg znaków, na przykład '2+3='), dodajmy
do niego wynik i zwróćmy to wszystko przez return:
let result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
let sum = Number(match1) + Number(match2);
return match0 + sum;
});
console.log(result);
Zadania praktyczne
Dany jest ciąg znaków:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Znajdź liczby stojące w nawiasach i zwiększ je dwukrotnie. To znaczy z naszego ciągu znaków powinien powstać następujący:
'aaa [4] bbb [6] ccc [24] ddd'
Dany jest ciąg znaków:
let str = '123 456 789';
Znajdź wszystkie liczby i odwróć ich cyfry w odwrotnej kolejności. To znaczy z naszego ciągu znaków powinien powstać następujący:
'321 654 987'
Dany jest ciąg znaków z datami:
let str = '31.12.2025 30.11.2024 29.10.2023';
Znajdź wszystkie daty i przekształć je w inny format tak, aby otrzymać następujący ciąg znaków:
'2025-12-31 2024-11-30 2023-10-29'