Абмежаванне прагнасці ў рэгулярках у JavaScript
Рэгулярныя выразы па змаўчанні прагныя. Гэта значыць, што яны захопліваюць максімальна магчымую колькасць сімвалаў. Давайце разбярэм на прыкладзе. Хай у нас ёсць вось такая радок:
let str = 'aeeex zzz x kkk';
Хай мы ў гэтай радку хочам знайсці падрадок
'aeeex' па наступным шаблоне: літара
'a', затым любы сімвал адзін ці больш
разоў, затым літара 'x'.
let res = str.replace(/a.+x/g, '!');
Мы чакаем, што ў зменную ў выніку
запішацца радок '! zzz x kkk'. Аднак,
гэта не так - у зменную трапляе радок
'! kkk'.
Усё дзела ў тым, што наша рэгулярка шукае ўсе
сімвалы ад літары 'a' да літары 'x'.
Але ў нашай радку дзве літары 'x'! З-за
прагнасці атрымліваецца, што рэгулярка шукае да
самага апошняга ікса, тым самым захопліваючы
не тое, што мы чакалі.
Вядома, часта такая паводзіны нам і трэба. Але менавіта ў гэтым выпадку мы б хацелі адмяніць прагнасць і сказаць рэгулярцы, каб яна шукала да першага ікса.
Каб абмежаваць прагнасць, трэба пасля аператара паўтарэння паставіць знак пытання:
let res = str.replace(/a.+?x/g, '!');
Прагнасць можна абмяжоўваць усім аператарам
паўтарэння: і *, і ?, і {}
- вось так: *?, ?? і {}?.
Дадзены радок:
let str = 'aba accca azzza wwwwa';
Напішыце рэгулярку, якая знойдзе ўсе радкі
па краях якіх стаяць літары 'a',
і замяніць кожную з іх на '!'. Паміж
літарамі 'a' можа быць любы сімвал (акрамя
'a').