Callback metode replace regulārajās izteiksmēs JavaScript
Replace metode kā otro parametru var pieņemt ne tikai virkni, bet arī callback funkciju, kas tiks piemērota katram atrastajam atbilstības gadījumam. Katra apakšvirkne, ko atrod regulārā izteiksme, tiks aizstāta ar to, ko šī funkcija atgriezīs tieši šai apakšvirknei.
Šai funkcijai var nodot parametrus: pirmajā parametrā tiks ievietota atrastā virkne, otrajā parametrā - pirmā atbilstības grupa, trešajā parametrā - otrā atbilstības grupa un tā tālāk - var izveidot tik parametrus, cik atbilstības grupu ir regulārajā izteiksmē.
Priekšpēdējā parametrā tiks ievietota pozīcija atrastās atbilstības, bet pēdējā - visa virkne, pa kuru tiek veikta meklēšana.
Kā tas viss strādā - izpētīsim ar praktiskiem piemēriem.
Piemērs
Ir dota virkne ar skaitļiem:
let str = '2 3 4 5';
Aizstāsim šos skaitļus ar to kvadrātiem. Vispirms vienkārši izvadīsim mūsu skaitļus pēc kārtas konsolē callback funkcijā:
str.replace(/\d+/g, function(match) {
console.log(match);
});
Mūsu kods vispirms izvadīs '2', tad
'3', '4' un '5'. Tas nozīmē,
ka mainīgajā match pēc kārtas nonāk
tās virknes, kuras atrada regulārā izteiksme.
Atrisināsim uzdevumu līdz galam - kāpināsim
match kvadrātā un atgriezīsim to
ar return. Izrādīsies, ka atrastajam
divniekam atgriezīsies 4 un divnieks tiks aizstāts
ar šo četrinieku, atrastajam trīsniekam atgriezīsies
9 un trīsnieks tiks aizstāts ar šo devītnieku
- un tā tālāk:
let result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // izvadīs '4 9 16 25'
Piemērs
Tagad virknē ir dotas konstrukcijas šādā formā
'2+3=':
let str = '2+3= 4+5= 6+7=';
Izdarīsim tā, lai aiz vienādības zīmes ievietotos atbilstošo skaitļu summas. Tas nozīmē, ka mūsu virknei jāpārvēršas sekojošā:
'2+3=5 4+5=9 6+7=13'
Lai atrisinātu uzdevumu, vēlreiz eksperimentēsim - sadalīsim pirmo un otro saskaitāmo atsevišķās atbilstības grupās:
str.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
Un tagad galīgi atrisināsim uzdevumu: katrai
atrastajai apakšvirknei saskaitīsim pirmo un
otro atbilstības grupu, paņemsim nulles grupu (atrasto
virkni, piemēram '2+3='), pievienosim
to rezultātam un atgriezīsim to visu caur return:
let result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
let sum = Number(match1) + Number(match2);
return match0 + sum;
});
console.log(result);
Praktiskie uzdevumi
Ir dota virkne:
let str = 'aaa [2] bbb [3] ccc [12] ddd';
Atrodiet skaitļus, kas atrodas iekavās, un palieliniet tos divas reizes. Tas nozīmē, ka no mūsu virknes vajadzētu izveidoties sekojošai:
'aaa [4] bbb [6] ccc [24] ddd'
Ir dota virkne:
let str = '123 456 789';
Atrodiet visus skaitļus un apgrieziet to ciparus apgrieztā secībā. Tas nozīmē, ka no mūsu virknes vajadzētu izveidoties sekojošai:
'321 654 987'
Ir dota virkne ar datumiem:
let str = '31.12.2025 30.11.2024 29.10.2023';
Atrodiet visus datumus un pārveidojiet tos citā formātā tā, lai izveidotos sekojoša virkne:
'2025-12-31 2024-11-30 2023-10-29'