JavaScript-də regex replace metodunda callback

Replace metodu ikinci parametr kimi təkcə sətir deyil, həm də funksiya-callback qəbul edə bilər, hansı ki, tapılan hər bir uyğunluğa tətbiq olunacaq. Regex-in tapdığı hər bir alt sətir, bu funksiyanın elə həmin alt sətir üçün qaytardığı şeylə əvəz olunacaq.

Bu funksiyaya parametrlər ötürülə bilər: birinci parametrə tapılan sətir yerləşdirilir, ikinci parametrə - birinci qrup, üçüncü parametrə - ikinci qrup və s. - regex ifadəsində neçə qrup varsa, o qədər parametr edə bilərsiniz.

Sondan əvvəlki parametrə tapılan uyğunluğun pozisiyası yerləşdirilir, sonuncu parametrə isə - axtarışın aparıldığı bütün sətir.

Bunun hamısının necə işlədiyini - praktiki nümunələr üzərində izah edək.

Nümunə

Tutaq ki, rəqəmlərdən ibarət sətir verilib:

javascriptlet str = '2 3 4 5';

Gəlin bu rəqəmləri onların kvadratları ilə əvəz edək. Əvvəlcə gəlin sadəcə callback funksiyasında rəqəmlərimizi növbə ilə konsola çıxaraq:

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

Bizim kod əvvəlcə '2', sonra '3', '4' və '5' çıxaracaq. Yəni match dəyişəninə növbə ilə regex-in tapdığı o sətirlər düşür.

Gəlin tapşırığı sona çatdıraq - match-i kvadrata yüksəldib return ilə qaytaraq. Belə çıxır ki, tapılan 2 üçün 4 qaytarılır və 2 dördlə əvəz olunur, tapılan 3 üçün 9 qaytarılır və 3 doqquzla əvəz olunur - və s.

javascriptlet result = str.replace(/\d+/g, function (match) {
  return match**2; 
});

console.log(result); // çıxardacaq '4 9 16 25'

Nümunə

Tutaq ki, indi sətirdə '2+3=' formasında konstruksiyalar verilib:

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

Gəlin elə edək ki, bərabərdən sonra uyğun rəqəmlərin cəmləri daxil edilsin. Yəni bizim sətirimiz aşağıdakına çevrilməlidir:

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

Tapşırığı həll etmək üçün gəlin yenə təcrübə edək - birinci və ikinci toplananları ayrı-ayrı qruplara ayıraq:

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

İndi isə tapşırığı tam həll edək: hər bir tapılan alt sətir üçün birinci və ikinci qrupları toplayaq, sıfırıncı qrupu (tapılan sətiri, məsələn '2+3=') götürək, ona nəticəni əlavə edək və hamısını return ilə qaytaraq:

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

console.log(result);

Praktiki tapşırıqlar

Задание 1

Sətir verilib:

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

Mötərizələrdə duran rəqəmləri tapın və onları iki dəfə artırın. Yəni bizim sətirimiz aşağıdakına çevrilməlidir:

javascript'aaa [4] bbb [6] ccc [24] ddd'
Задание 2

Sətir verilib:

javascriptlet str = '123 456 789';

Bütün rəqəmləri tapın və onların rəqəmlərini əks ardıcıllıqla çevirin. Yəni bizim sətirimiz aşağıdakına çevrilməlidir:

javascript'321 654 987'
Задание 3

Tarixlərdən ibarət sətir verilib:

javascriptlet str = '31.12.2025 30.11.2024 29.10.2023';

Bütün tarixləri tapın və onları başqa formata çevirin ki, aşağıdakı sətir alınsın:

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