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