themajklOdpovím obecně, nevím, jak to dělá preg. Píšu si zrovna vlastní parser reg výrazů v C++ (mám k němu speciální požadavky) a tak jsem na žravost opakovacích operátorů narazil.
V zásadě ty opakující operátory fungují jednoduše. Dokud lze požírat levou stranu *, požírej a zkoušej matchovat pravou stranu. Pokud se nepodaří levou stranu požrat, ukonči opakování a výsledkem je poslení úspečné matchování pravé strany. Příklad
.*B
Protože . vyhoví každý znak, zastaví se požírání až na konci řetězce. Po sežrání VŠECH znaků se najde taková varianta, kdy matchovala pravá strana, tedy B.
AAABBBB
Matchne na poslední B.
Nevím, jestli preg umí lazy modifikaci
A.*?B
Tam se požírání ukončí v okamžiku, kdy pravá strana se poprvé matchne.
U příkladu
AAABBB
tedy požere dvě Ačka aby matchla první B
PS: Ještě poznámka, pokud nedám na začátek výrazu ^, pak je to jako bych tam napsal ^.*?. Pokud vím, regexp matchuje první řetězec odpovídající regulárnímu výrazu, není tedy neuvedení ^ žravé. |