Grupowanie(?) RegExpów

0

Hej. Mam prosty problem, na który nie znalazłem prostej odpowiedzi ;)

Jest sobie programik w C#, który będzie co jakiś czas dostawał nowe teksty (stringi). Programik ma zakodowane w p*du RegExpów 'definiujących' to, co te stringi mogą zawierać, powiedzmy 100 różnych regexpów. I teraz żeby ustalić, który z nich nasz string reprezentuje, trzeba by było za każdym razem wykonać 100 (ok, średnio 50) operacji przetwarzania tekstu wyrażeniem regularnym, co - obawiam się - może nie być najlepszym pomysłem.
Czy istnieje w C# jakaś struktura inteligentnie "grupująca" regexpy? Gdybyśmy np. porównywali string ze stringiem, można by było zbudować drzewo binarnych wyszukiwań, dzięki któremu znacząco zmniejszylibyśmy liczbę operacji. Tu jednak mamy nie zwykły string, a wyrażenie regularne, w dodatku utworzone też dynamicznie, na starcie programu... Da się to jakoś sprytnie zoptymalizować? ;)

0

A nie mozesz zoptymalizowac tych wyrazen i zlozyc je w jedno/kilka? - chociazby stosujac alternatywe. Nie za bardzo rozumiem idei 'grupowania' regexpow... Mozesz to jakos jasniej opisac? Moze przyklad jakis?

0

Albo samemu zrób sobie drzewo binarne, które w każdym elemencie ma wyrażenie regularne. Gdy ciąg je spełnia, odpowiada regex'pom po lewej, w przeciwnym wypadku po prawej. Oczywiście samemu musiałbyś uogólniać zapis wyrażeń regularnych.

0

Chodzi o to, że znam postać komunikatu, jaki mogę dostać, np:

<font color="red">** przychodzi %s...</span>
<font color="red">** %s ip=%s</span>
<font color="red">** odchodzi %s... %s</span>
<font color="red">** %s ip=%s</span>

(są tego dziesiątki) i chciałbym móc każdy z nich "rozpoznać" i rozbić na czynniki. W większości przypadków po prostu zamieniam wszelkie %s na (.+?), ale bywają tez wyrażenia bardziej złożone... Tutaj akurat większość (jeśli nie wszystkie) zaczyna się od identycznej sekwencji znaków, ale to jest dowolne i zależy w każdym pojedynczym komunikacie wyłącznie od inwencji kogoś tam - ja zakładam tylko, że dostanę plik z konfiguracją serwera z tekstami w powyższej postaci.
Łączenie tego w jedno wyrażenie wyglądałoby kosmicznie... Ale nie mam pewności, czy łatwo mógłbym określić wtedy, KTÓRY komunikat dostałem. A jak samemu zbudować takie drzewo binarne? Tego właśnie zupełnie nie widzę :) Zwlaszcza przy regexpach, a nie stringach...

0

Ale tobie wyrazenia regularne sluza do sprawdzenia czy np. tekst 'przychodzi' jest zawarty w tekscie, czy bardziej do wyluskania innej informacji? A drzewo binarne mozesz zbudowac tak, ze sam pogrupujesz sobie wyrazenia (na kartce powiedzmy) od najbardziej ogolnych do bardziej szczegolowych. Zreszta nie musi to byc binarne, moze byc np. struktura trie. Na pierwszym poziomie mialbys, powiedzmy, 5 ogolnych wyrazen, ktore gwarantuja, ze jesli jakis tekst odpowiada ktoremukolwiek z wszystkich Twoich wyszukanych, to w ktores z tych 5 wpadnie, itd. Oczywiscie musialbys sobie te wyrazenia sam rozplanowac. Do stworzenia drzewa mozesz wykorzystac chociazby System.Collections.Generic.LinkedList.

1 użytkowników online, w tym zalogowanych: 0, gości: 1