⊗jsSpRERMC 127 of 294 menu

Callback v metodě replace v regulárních výrazech JavaScript

Metoda replace může jako druhý parametr přijímat nejen řetězec, ale také funkci-callback, která se aplikuje na každý nalezený výskyt. Každý podřetězec, který našel regulární výraz, bude nahrazen tím, co vrátí tato funkce právě pro tento podřetězec.

Do této funkce lze předávat parametry: do prvního parametru se vloží nalezený řetězec, do druhého parametru - první zachycená skupina, do třetího parametru - druhá zachycená skupina a tak dále - lze vytvořit tolik parametrů, kolik je zachycených skupin v regulárním výrazu.

Do předposledního parametru se vloží pozice nalezeného výskytu a do posledního - celý řetězec, ve kterém se vyhledává.

Jak to všechno funguje - rozebereme na praktických příkladech.

Příklad

Nechť je dán řetězec s čísly:

let str = '2 3 4 5';

Nahradíme tato čísla jejich čtverci. Nejprve vypišme naše čísla postupně do konzole ve funkci-callbacku:

str.replace(/\d+/g, function(match) { console.log(match); });

Náš kód vypíše nejprve '2', poté '3', '4' a '5'. To znamená, že do proměnné match postupně přicházejí ty řetězce, které našel regulární výraz.

Dokončeme řešení úlohy - umocníme match na druhou a vrátíme jej pomocí return. Vyjde nám, že pro nalezenou dvojku se vrátí 4 a dvojka se nahradí tou čtverkou, pro nalezenou trojku se vrátí 9 a trojka se nahradí tou devítkou - a tak dále:

let result = str.replace(/\d+/g, function (match) { return match**2; }); console.log(result); // vypíše '4 9 16 25'

Příklad

Nechť nyní v řetězci jsou dány konstrukce typu '2+3=':

let str = '2+3= 4+5= 6+7=';

Udělejme, aby se za rovná se vložily součty příslušných čísel. To znamená, že náš řetězec se musí přeměnit na následující:

'2+3=5 4+5=9 6+7=13'

K řešení úlohy opět experimentujme - rozložme první a druhý sčítanec do samostatných zachycených skupin:

str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) { console.log(match0, match1, match2); });

A nyní úlohu dokončíme: pro každý nalezený podřetězec sečteme první a druhou zachycenou skupinu, vezmeme nultou skupinu (nalezený řetězec, například '2+3='), přidáme k němu výsledek a vrátíme toto vše pomocí return:

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

Praktické úlohy

Je dán řetězec:

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

Najděte čísla stojící v závorkách a zvyšte je dvakrát. To znamená, že z našeho řetězce musí vzniknout následující:

'aaa [4] bbb [6] ccc [24] ddd'

Je dán řetězec:

let str = '123 456 789';

Najděte všechna čísla a otočte jejich číslice v obráceném pořadí. To znamená, že z našeho řetězce by měl vzniknout následující:

'321 654 987'

Je dán řetězec s daty:

let str = '31.12.2025 30.11.2024 29.10.2023';

Najděte všechna data a převeďte je do jiného formátu tak, aby vznikl následující řetězec:

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