Կանոնավոր արտահայտությունների ագահությունը սահմանափակելը 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' տառից):