Колбэк у метадзе replace у рэгулярках JavaScript

Метад replace другім параметрам можа прымаць не толькі радок, але і функцыю-колбэк, якая прымяніцца для кожнага знойдзенага супадзення. Кожная падрадок, якую знайшла рэгулярка, замяніцца на тое, што верне гэтая функцыя менавіта для гэтай падрадкі.

У гэтую функцыю можна перадаваць параметры: у першы параметр пакладзецца знойдзены радок, у другі параметр - першы кішэнь, у трэці параметр - другі кішэнь і так далей - можна рабіць колькі параметраў, колькі кішэняў у рэгулярным выразе.

У перадапошні параметр пакладзецца пазіцыя знойдзенага супадзення, а ў апошні - ўвесь радок, па якому робіцца пошук.

Як гэта ўсё працуе - разбярэм на практычных прыкладах.

Прыклад

Хай дадзены радок з лікамі:

javascriptlet str = '2 3 4 5';

Давайце замянім гэтыя лікі на іх квадраты. Для пачатку давайце проста вывядзем нашы лікі па чарзе ў кансоль у функцыі-колбэку:

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

Наш код выведзе спачатку '2', потым '3', '4' і '5'. Гэта значыць у зменную match паслядоўна трапляюць тыя радкі, якія знайшла рэгулярка.

Давайце вырашiм задачу да канца - будзем узводзіць 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);
});

А цяпер канчаткова вырашiм задачу: для кожнай знойдзенай падрадкі прасумуем першы і другі кішэні, возьмем нулявы кішэнь (знойдзены радок, напрыклад '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);

Практычныя задачы

Задание 1

Дадзены радок:

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

Знайдзіце лікі, якія стаяць у дужках і павялічце іх у два разы. Гэта значыць з нашага радка павінен атрымацца наступны:

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

Дадзены радок:

javascriptlet str = '123 456 789';

Знайдзіце ўсе лікі і перавярніце іх лічбы ў адваротным парадку. Гэта значыць з нашага радка павінен атрымацца наступны:

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

Дадзены радок з датамі:

javascriptlet str = '31.12.2025 30.11.2024 29.10.2023';

Знайдзіце ўсе даты і пераўтварыце іх у другі фармат так, каб атрымаўся наступны радок:

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