Коллбэк дар усули 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'