A mégis mohó nem mohó regex

A normál regex quantifierek, mint a ?+* mohók, azaz, a lehető leghosszabb egyezést fogják meg.

Azaz, a “cica kutya ló” bemenetre az “a.+” regex a “a kutya ló” részt ragadja meg, nem pedig az “a ló”-t, mert mohó a +.

Ha azt akarjuk, hogy ne legyen mohó, ?-et kell a quantifier után írni:

Így két egyezés is van. Eddig ez triviális.

A gond ott kezdődött, amikor több sorban kellett valamit megkeresni. Ilyenkor be lehet kapcsolni a SingleLine módot, és ekkor a . egyezik a sorvége karakterekre is (\r és \n). Normál esetben nem. Ilyenkor látszólag másképp működik a nem mohó quantifier.

Példa szövegesen, ha valaki ki akarja próbálni:

CreateForExcel\<(\w+?)\>.+?Cica

CreateForExcel<Nyau>);
return CreateListExcel("ccc", 
Cica

CreateForExcel<Vau>);
return CreateListExcel("kkk",
Kutya

A feladat, hogy a Cica előtt meg kell találni a legközelebbi CreateForExcelt, és kiszedni a generikus argument értékét (Nyau). Ez szépen működik.

Na, de most jön a kutya!

Látható, hogy nem a legrövidebb egyezést fogta meg, hanem a leghosszabbat, pedig miden quantifier non gready.

Miért?

(A regex nem C# elemzésre való, de hébe-hóba mindenki szeret néha hekkelni.)

2 thoughts on “A mégis mohó nem mohó regex

  1. SebDani

    Mi a kérdés LÉNYEGE?
    Keresed azt a patternt, ami a Vau-t találja meg a Kutya esetén?
    Vagy tényleg az érdekel, hogy miért nem működik az, amit fent leírtál?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *