Կանոնավոր արտահայտությունների ագահությունը սահմանափակելը PHP-ում

Կանոնավոր արտահայտությունները լռելյայնորեն ագահ են: Սա նշանակում է, որ դրանք գրավում են առավելագույն հնարավոր թվով նիշեր:

Եկեք նայենք մի օրինակի: Ենթադրենք, մենք ունենք հետևյալ տողը:

php<?php
  $str = 'aeeex zzz x kkk';
?>

Ենթադրենք, այս տողում մենք ցանկանում ենք գտնել 'aeeex' ենթատողը հետևյալ կաղապարով. տառ 'a', ապա ցանկացած նիշ մեկ կամ ավելի անգամ, ապա 'x' տառը:

php<?php
  $res = preg_replace('#a.+x#', '!', $str);
?>

Մենք ակնկալում ենք, որ արդյունքում փոփոխականի մեջ կգրվի '! zzz x kkk' տողը: Սակայն, դա այդպես չէ. փոփոխականի մեջ հայտնվում է '! kkk' տողը:

Ամբողջ բանն այն է, որ մեր կանոնավոր արտահայտությունը փնտրում է բոլոր նիշերը 'a' տառից մինչև 'x' տառը: Բայց մեր տողում կան երկու 'x' տառ: Ագահության պատճառով ստացվում է, որ կանոնավոր արտահայտությունը փնտրում է մինչև վերջին x-ը, thereby capturing այն, ինչ մենք չէինք ակնկալում:

Իհարկե, հաճախ հենց այդպիսի վարքագիծ է մեզ անհրաժեշտ: Բայց կոնկրետ այս դեպքում մենք կցանկանայինք չեղարկել ագահությունը և ասել կանոնավոր արտահայտությանը, որ այն փնտրի մինչև առաջին x-ը:

Ագահությունը սահմանափակելու համար անհրաժեշտ է կրկնության օպերատորից հետո դնել հարցականի նշան.

php<?php
  $res = preg_replace('#a.+?x#', '!', $str);
?>

Ագահությունը կարելի է սահմանափակել բոլոր կրկնության օպերատորներին, ահա այսպես. *?, ?? և {}?:

Задание 1

Տրված է տողը.

php<?php
  $str = 'aba accca azzza wwwwa';
?>

Գրեք կանոնավոր արտահայտություն, որը կգտնի բոլոր տողերը, որոնց եզրերում կան 'a' տառերը, և կփոխարինի դրանցից յուրաքանչյուրը '!'-ով: a տառերի միջև կարող է լինել ցանկացած նիշ (բացի 'a'-ից):