A kapzsiság korlátozása reguláris kifejezésekben PHP-ben

A reguláris kifejezések alapértelmezetten kapzsiak. Ez azt jelenti, hogy a lehető legtöbb karaktert próbálják megragadni.

Nézzünk egy példát. Tegyük fel, hogy van egy ilyen karakterláncunk:

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

Tegyük fel, hogy ebben a karakterláncban meg szeretnénk találni a 'aeeex' részt a következő minta alapján: az 'a' betű, majd bármely karakter egy vagy többször, majd az 'x' betű.

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

Arra számítanánk, hogy az eredményül kapott változó a '! zzz x kkk' karakterlánc lesz. Azonban ez nem így van - a változóba a '! kkk' karakterlánc kerül.

Az egész azon múlik, hogy a reguláris kifejezésünk minden karaktert keres az 'a' betűtől az 'x' betűig. De a karakterláncunkban két 'x' betű van. A kapzsiság miatt az történik, hogy a regex a legutolsó x-ig keres, ezzel megragadva nem azt, amire számítottunk.

Természetesen gyakran pontosan ez a viselkedés a szükséges. De ebben a konkrét esetben szeretnénk megszüntetni a kapzsiságot, és azt mondani a regexnek, hogy az első x-ig keressen.

A kapzsiság korlátozásához az ismétlési operátor után kérdőjelet kell tenni:

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

A kapzsiság minden ismétlési operátornál korlátozható, így: *?, ?? és {}?.

Задание 1

Adott egy karakterlánc:

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

Írjon reguláris kifejezést, amely meg fogja találni az összes olyan karakterláncot, amelynek szélein 'a' betűk állnak, és mindegyiket lecseréli '!'-ra. Az a betűk között bármilyen karakter lehet (kivéve 'a').