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.

January 7, 2022 / by Zsolt Soczó

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.)

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

  • SebDani January 8, 2022

    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?

    • Soczó Zsolt January 9, 2022

      Az érdekel, miért nem a legrövidebb egyezést találja meg a csak nem mohó kifejezéseket tartalmazó regex.