JavaScript тіліндегі реттік іздеулердің ашкөздігін шектеу
Реттік іздеулер әдепкі бойынша ашкөз болады. Бұл олардың символдардың мүмкін болатын ен көп санын ұстап алатынын білдіреді. Мысал арқылы қарастырайық. Бізде мынадай жол болсын:
let str = 'aeeex zzz x kkk';
Бұл жолда біз 'aeeex' ішкі жолын
мына үлгі бойынша тапқымыз келеді: 'a' әрпі,
содан кейін кез келген символ бір немесе одан да көп
рет, содан кейін 'x' әрпі.
let res = str.replace(/a.+x/g, '!');
Біз нәтижеде айнымалыға '! zzz x kkk' жолы
жазылады деп күтеміз. Алайда,
бұл олай емес - айнымалыға '! kkk'
жолы түседі.
Мәселе мынада, біздің реттік іздеу 'a' әрпінен
'x' әрпіне дейінгі барлық
символдарды іздейді.
Бірақ біздің жолда екі 'x' әрпі бар!
Ашкөздіктен туындап, реттік іздеу ең
соңғы 'x' әрпіне дейін іздейді, осылайша біз күткеннен
басқа нәрсені ұстап алады.
Әрине, көбінесе мінездеменің бізге дәл сондай керек болады. Бірақ дәл осы жағдайда біз ашкөздікті өшіргіміз келіп, реттік іздеуге бірінші 'x' әрпіне дейін іздеуді айтқымыз келеді.
Ашкөздікті шектеу үшін, қайталау операторының артына сұрақ белгісі қою керек:
let res = str.replace(/a.+?x/g, '!');
Ашкөздікті барлық қайталау операторларына
шектеуге болады: *, ?, және {}
- мыналай: *?, ?? және {}?.
Мына жол берілген:
let str = 'aba accca azzza wwwwa';
Шеттерінде 'a' әрпі тұрған барлық жолдарды
табатын реттік іздеу жазыңыз,
және олардың әрқайсысын '!'-ге ауыстырыңыз.
'a' әрпінің арасында
кез келген символ ('a'-дан басқа) болуы мүмкін.