Ограничење похлепности регуларних израза у 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').