Lekcje modułu (3/4)
Zamiana z funkcją callback
Jeśli ciąg zamienny to za mało, przekaż funkcję:
str.replace(regex, (match, ...groups) => string). Funkcja callback jest wywoływana dla każdego dopasowania, a zwracana przez nią wartość staje się zamiennikiem.
'prezzi: 10 20 30'.replace(/\d+/g, (m) => Number(m) * 1.22);
// "prezzi: 12.2 24.4 36.6" (22% VAT)Argumenty funkcji callback
str.replace(regex, (match, p1, p2, ..., offset, original, groups) => ...);match-- całe dopasowanie.p1,p2, … -- przechwycone grupy w kolejności ich występowania.offset-- indeks dopasowania w oryginalnym ciągu znaków.original-- cały ciąg znaków.groups-- obiekt zawierający grupy nazwane (o ile istnieją).
'2024-03-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, (_, a, m, g) => `${g}/${m}/${a}`);
// "15/03/2024"Funkcja callback daje Ci nieograniczone możliwości: parsowanie, wyszukiwanie w słowniku, konwersję, escapowanie HTML… wszystko to, czego nie potrafi zrobić statyczny ciąg znaków.
Zaawansowane argumenty w funkcjach callback metody replace
Funkcja callback otrzymuje kilka argumentów: pełne dopasowanie, każdą przechwyconą grupę, offset dopasowania w całym tekście oraz oryginalny ciąg wejściowy. Umożliwia to stosowanie zaawansowanej logiki przekształceń opartej na kontekście.
Spróbuj sam
Znajdź każdą liczbę całkowitą w tekście (w replace przekazano by `(m) => Number(m) * 2` w celu jej podwojenia).
Pokaż wskazówkę
Użyj \d+ (jedna lub więcej cyfr), aby przechwycić każdą liczbę całkowitą jako pojedyncze dopasowanie.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Znajdź każdy adres e-mail (postać uproszczona: litery/cyfry/kropki/podkreślenia @ domena). W ten sposób funkcja callback mogłaby go ukryć jako `***@domena`.
Pokaż wskazówkę
Rozszerz klasę do [\w.]+ , aby akceptować kropki w nazwie użytkownika i domenie.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Dopasuj każde słowo składające się z liter w tekście, aby mogło zostać przekształcone na wielkie litery za pomocą funkcji callback.
Pokaż wskazówkę
Znajdź zwykłe litery za pomocą [a-zA-Z]+.
Rozwiązanie dostępne po 3 próbach