JavaScriptда регуляр ифодасининг ўзидаги карманлар
Карманларнинг мазмуни факатгина алмаштириш сатридагина эмас, балки регуляр ифодасининг ўзида ҳам мавжуд: биз бирор нарсани карманга қўйишимиз мумкин, сўнгра регуляр ифодасининг ўзида, айнан шу жерда ўша карманнинг мазмуни бўлиши керак, деб айтишимиз мумкин.
Карманларнинг мазмуни уларнинг рақамлари
орқали мавжуд бўлиб, уларнинг олдида тескари
чайра (\) туради. Масалан, биринчи карман
мана шундай қилиб мавжуд бўлади: \1,
иккинчи карман мана шундай - \2, учинчи
- \3 ва ҳоказо.
Мен сизлар учун юқорида ёзилган ҳамма нарса ҳозирча аниқ эмас, деб ишонаман. Бу таажжубланарли эмас, чунки карманлар - регуляр ифодаларининг энг тушунсиз жойидир. Келинг, мисоллар орқали тушуниб оламиз.
Мисол
Фарз қилайлик, бизда мана бундай сатр бор:
let str = 'aa bb cd ef';
Келинг, унда кетма-кет келадиган иккита бир хил ҳарф турган ҳамма жойларни топайлик. Масалани ечиш учун биз қандайдир бир ҳарфни топамиз, уни карманга соламиз, сўнгра кейинги белги шу карманнинг мазмуни эканини текшарамиз:
let res = str.replace(/([a-z])\1/g, '!');
Натижада ўзгарувчига куйидагилар ёзилади:
'! ! cd ef'
Мисол
Фарз қилайлик, бизда мана бундай сатр бор:
let str = 'asxca buzxb csgd';
Келинг, унда биринчи ва охирги ҳарфлари бир хил бўлган ҳамма сўзларни топайlik. Масалани ечиш учун куйидаги намунани ёзамиз: ҳарф, сўнгра яна битта ёки ундан ортиқ ҳарф, ва сўнгра биринчи ҳарф каби бир хил ҳарф:
let res = str.replace(/([a-z])[a-z]+\1/g, '!');
Натижада ўзгарувчига куйидагилар ёзилади:
'! ! csgd'
Амалий масалалар
Сатр берилган:
let str = 'aaa bbb ccc xyz';
Унда кетма-кет учта бир хил ҳарф мавжуд бўлган ҳамма қисм сатрларни топинг.
Сатр берилган:
let str = 'a aa aaa aaaa aaaaa';
Унда кетма-кет иккита ва ундан ортиқ бир хил ҳарф мавжуд бўлган ҳамма қисм сатрларни топинг.
Сатр берилган:
let str = 'aaa aaa bbb bbb ccc ddd';
Унда кетма-кет иккита бир хил сўз мавжуд бўлган ҳамма қисм сатрларни топинг.