Spätné volanie v metóde replace v regulárnych výrazoch JavaScript
Metóda replace ako druhý parameter môže prijímať nielen reťazec, ale aj funkciu-spätné volanie, ktorá sa aplikuje pre každý nájdený zhodu. Každý podreťazec, ktorý nájde regulárny výraz, sa nahradí tým, čo vráti táto funkcia práve pre tento podreťazec.
Do tejto funkcie je možné odovzdávať parametre: do prvého parametra sa vloží nájdený reťazec, do druhého parametra - prvá zachytená skupina, do tretieho parametra - druhá zachytená skupina a tak ďalej - je možné vytvoriť toľko parametrov, koľko je zachytených skupín v regulárnom výraze.
Do predposledného parametra sa vloží pozícia nájdenej zhody a do posledného - celý reťazec, v ktorom sa vykonáva vyhľadávanie.
Ako to všetko funguje - rozoberieme na praktických príkladoch.
Príklad
Nech je daný reťazec s číslami:
let str = '2 3 4 5';
Nahraďme tieto čísla ich štvorcami. Na začiatok si jednoducho vypíšme naše čísla postupne do konzoly vo funkcii-spätnom volaní:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Náš kód vypíše najprv '2', potom
'3', '4' a '5'. To znamená
že do premennej match postupne prichádzajú
reťazce, ktoré našiel regulárny výraz.
Poďme vyriešiť úlohu do konca - budeme umocňovať
match na druhú a vrátime ho
pomocou return. Vyjde, že pre nájdenú
dvojku sa vráti 4 a dvojka sa nahradí
tou štvorkou, pre nájdenú trojku sa vráti
9 a trojka sa nahradí tou deviatkou
- a tak ďalej:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // vypíše '4 9 16 25'
Príklad
Nech teraz v reťazci sú dané konštrukcie typu
'2+3=':
let str = '2+3= 4+5= 6+7=';
Urobme tak, aby sa za rovnáso vložili súčty príslušných čísel. To znamená, že náš reťazec sa musí premeniť na nasledujúci:
'2+3=5 4+5=9 6+7=13'
Pre riešenie úlohy sa opäť poexperimentujme - rozložme prvé a druhé sčítance do samostatných zachytených skupín:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
A teraz úlohu dokončite: pre každý
nájdený podreťazec sčítajme prvú a
druhú zachytenú skupinu, vezmime nulovú skupinu (nájdený
reťazec, napríklad '2+3='), pridajme
k nemu výsledok a vráťme to všetko cez 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
Daný reťazec:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Nájdite čísla stojace v zátvorkách a zväčšite ich dvakrát. To znamená z nášho reťazca by mal vzniknúť nasledujúci:
'aaa [4] bbb [6] ccc [24] ddd'
Daný reťazec:
let str = '123 456 789';
Nájdite všetky čísla a otočte ich číslice v opačnom poradí. To znamená z nášho reťazca by mal vzniknúť nasledujúci:
'321 654 987'
Daný reťazec s dátumami:
let str = '31.12.2025 30.11.2024 29.10.2023';
Nájdite všetky dátumy a pretransformujte ich do iného formátu tak, aby vznikol nasledujúci reťazec:
'2025-12-31 2024-11-30 2023-10-29'