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

Replace метода иккинчи параметр сифатида факат сатрни эмас, балки функция-коллбэкни ҳам қабул қилиши мумкин, у ҳар бир топилган мослик учун қўлланилади. Ҳар бир сатрбошқа, уни регулярка топган, ўша сатрбошқа айнан ўша функция қайтарган нарсага алмаштирилади.

Бу функцияга параметрлар бериш мумкин: биринчи параметрга топилган сатр, иккинчи параметрга - биринчи карман, учинчи параметрга - иккинчи карман ва ҳоказо - регуляр ифодадаги карманлар сонича параметр қилиш мумкин.

Ўнга яқин параметрга топилган мосликнинг позицияси, охиргисига эса - излаш амалга оширилаётган бутун сатр қўйилади.

Бу ҳаммаси қандай ишлашини амалий мисолларда кўриб чиқамиз.

Мисол

Сонлардан иборат сатр берилган деб фараз қилайлик:

javascriptlet str = '2 3 4 5';

Келинг, бу сонларни уларнинг квадратларига алмаштирайлик. Бошлаш учун келинг, функция-коллбэкда ўз сонларимизни навбат-навбат консолга чиқарайлик:

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

Бизнинг код аввал '2' ни, сўнгра '3' ни, '4' ва '5' ни чиқаради. Яъни match ўзгарувчисига навбат билан регулярка топган сатрлар тушadi.

Келинг, масалани охиригача ечамиз - 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);

Амалий масалалар

Задание 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

Cанатлар билан сатр берилган:

javascriptlet str = '31.12.2025 30.11.2024 29.10.2023';

Ҳамма санатларни топинг ва уларни бошқа форматга ўгиринг, натижада куйидаги сатр ҳосил бўлсин:

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