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.)
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.
LEAVE A COMMENT
2 COMMENTS
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?
Az érdekel, miért nem a legrövidebb egyezést találja meg a csak nem mohó kifejezéseket tartalmazó regex.