Калбек во методот replace во регуларните изрази на JavaScript
Методот replace како втор параметар може да прифати не само стринг, туку и функција-калбек, која ќе се примени за секој пронајден совпаѓање. Секоја подниза, која ја најде регуларката, ќе се замени со она што ќе ја врати таа функција конкретно за таа подниза.
Во оваа функција може да се пренесуваат параметри: во првиот параметар ќе се стави пронајдениот стринг, во вториот параметар - првиот џеб, во третиот параметар - вториот џеб и така натаму - може да се направи колку параметри, толку џебови има во регуларниот израз.
Во претпоследниот параметар ќе се стави позицијата на пронајденото совпаѓање, а во последниот - целата низа, по која се врши пребарувањето.
Како функционира сето ова - ќе разгледаме со практични примери.
Пример
Нека е дадена низа со броеви:
javascriptlet str = '2 3 4 5';
Ајде да ги замениме овие броеви со нивните квадрати. За почеток, ајде едноставно да ги испечатиме нашите броеви еден по еден во конзолата во функцијата-калбек:
javascriptstr.replace(/\d+/g, function(match) {
console.log(match);
});
Нашиот код прво ќе испечати '2', потоа
'3', '4' и '5'. Тоа значи
дека во променливата match последователно се добиваат
оние низи кои ги нашла регуларката.
Ајде да ја решиме задачата до крај - ќе го подигнеме
match на квадрат и ќе го вратиме
со return. Ќе испадне дека за пронајдената
двојка ќе се врати 4 и двојката ќе се замени
со оваа четворка, за пронајдената тројка ќе се врати
9 и тројката ќе се замени со оваа деветка
- и така натаму:
javascriptlet result = str.replace(/\d+/g, function (match) {
return match**2;
});
console.log(result); // ќе испечати '4 9 16 25'
Пример
Нека сега во низата се дадени конструкции од видот
'2+3=':
javascriptlet str = '2+3= 4+5= 6+7=';
Ајде да направиме така што после еднакво да се вметнат збировите на соодветните броеви. Тоа значи дека нашата низа треба да се претвори во следнава:
javascript'2+3=5 4+5=9 6+7=13'
За решавање на задачата, ајде повторно да експериментираме - да ги распоредиме првиот и вториот собирок во посебни џебови:
javascriptstr.replace(/(\d+)\+(\d+)=/g, function (match0, match1, match2) {
console.log(match0, match1, match2);
});
А сега дефинитивно да ја решиме задачата: за секоја
пронајдена подниза ќе ги собереме првиот и
вториот џеб, ќе го земеме нултиот џеб (пронајдената
низа, на пример '2+3='), ќе додадеме
на неа резултатот и ќе го вратиме сето ова преку return:
javascriptlet result = str.replace(/(\d+)\+(\d+)=/g, function(match0, match1, match2) {
let sum = Number(match1) + Number(match2);
return match0 + sum;
});
console.log(result);
Практични задачи
Дадена е низа:
javascriptlet str = 'aaa [2] bbb [3] ccc [12] ddd';
Пронајдете ги броевите кои стојат во загради и зголемете ги за два пати. Тоа значи дека од нашата низа треба да се добие следнава:
javascript'aaa [4] bbb [6] ccc [24] ddd'
Дадена е низа:
javascriptlet str = '123 456 789';
Пронајдете ги сите броеви и превртете ги нивните цифри во обратен редослед. Тоа значи дека од нашата низа треба да се добие следнава:
javascript'321 654 987'
Дадена е низа со датуми:
javascriptlet str = '31.12.2025 30.11.2024 29.10.2023';
Пронајдете ги сите датуми и претворете ги во друг формат така што ќе се добие следнава низа:
javascript'2025-12-31 2024-11-30 2023-10-29'