Regular Expressions



  • nachdem boost::regex jetzt bei mir läuft und ich auch 'ne schicke kleine Testapplikation gebaut habe jetzt die Ernüchterung, das mir das ohne halbwegs vernünftiges Verständnis von Regular Expressions eigentlich gar nichts nützt:).
    Hat irgendwer einen schicken Link zu einem einfach verständlichen Tutorial für einen schnellen Einstieg?

    [url]http://www.weigl.de/seminar/php4/zeichen_regex.htm [/url]

    giebt es leider nicht mehr.

    Gleich eine erste Frage:

    Ich habe einen string in dem Stehen durch Komma getrennte Zahlen( 1,2,3,4,5... ). Diese würde ich jetzt gerne durch Zahlwörter ( eins, zwei, drei... ) ersetzen.

    Wie würde der Code dann mit boost::regex aussehen? Ich könnte natürlich einfach jede Zahl einzeln ersetzen (wäre je Zahl ein Aufruf von regex_replace), aber ich bin sicher, das das irgendwie auch schöner gehen muß. Einfach gesagt: ich will irgendwie in einer Anweisung ausdrücken, wenn string == '1' write "Eins".



  • Hi,

    vielleicht ein wenig an PHP gebunden, hat mir aber sehr gut gefallen.

    http://tut.php-q.net/regex.html

    MfG Eisflamme



  • Das tut ist als kleine Einführung schon nicht schlecht. Ich werd wohl noch ein bisschen mit der boost doku kämpfen und ein bisschen mit try and error weitermachen.
    Der Syntax macht mich trotzdem wahnsinnig. Da werd ich wohl auf Ewigkeiten nachschlagen müssen :).



  • TheBigW schrieb:

    Der Syntax macht mich trotzdem wahnsinnig. Da werd ich wohl auf Ewigkeiten nachschlagen müssen :).

    Daran gewöhnt man sich viel schneller als Du vielleicht glaubst. 🙂

    Zur Ersetzung Deiner Zahlen: Das würde ich einfach mit einem assoziativen Array machen, in Deinem Fall reicht sogar ein std::vectorstd::string oä wenn Du nur Zahlen ersetzen magst. Dann einfach 1 durch foobar[1] ersetzen oä.
    Für so einfache Ersetzungssachen machen regexps noch nicht rasend viel Sinn.



  • das war nur ein Beispiel. Ich hab hier gerade ein Projekt fertig, wo ich Patientendaten von 'nem File einlese (Name, Vorname GebDat., ID). Das sind jedesmal diese Daten, aber immer hinter anderen Keys. In dem Projekt habe ich halt die Keys konfigurierbar gemacht.
    Nun wollte ich halt, da ich sowieso gerade ein bisschen in der boost rumstöber regex nutzen um aus egal welchem Eingangsfiletyp immer ein und das selbe Ausgangsformat zu erzeugen -> sprich die Keys vereinheitlichen. Ich müßte dann sozusagen nur die jeweilge regular - expression konfigurierbar machen (das macht das Konfigfile übversichtlicher) - unser Außendienstler wird sich freuen..

    Vielleicht gewöhne ich mich wirklich noch an den Syntax, auch wenn es immer so aussieht, wie wenn Leute in Comics fluchen 😃 .



  • TheBigW schrieb:

    Ich müßte dann sozusagen nur die jeweilge regular - expression konfigurierbar machen (das macht das Konfigfile übversichtlicher) - unser Außendienstler wird sich freuen..

    Ja, das klingt nett. 🙂
    Ich versteh Deine Frage zwar noch immer nicht ganz (Wo hängst Du?), aber das Ganze macht schon mehr Sinn. Wenn Du Probleme irgendwo hast dann melde Dich einfach mal.

    Vielleicht gewöhne ich mich wirklich noch an den Syntax, auch wenn es immer so aussieht, wie wenn Leute in Comics fluchen 😃 .

    Das is noch gar nix, ich habe einige Zeit lang mein Geld primär mit Perl verdient. Und eines Tages hat meine Freundin spaßhalber einfach ein paar von den Zeichen die sie in meinen Programmen gesehen hatte (viele $s, viele @s viele [], viele /foo/s etc) genommen, augenzwinkernd gemeint das könne sie auch und ohne es zu wissen ein funktionierendes fünfzeiliges Perl-Programm geschriebem. 😃

    (Hat zwar nichts ausgegeben weil es nur ein paar Array-Teile in den Pattern-Space kopiert hat, war aber völlig legaler Code; wie ich erschüttert feststellen musste.)



  • nman schrieb:

    Das is noch gar nix, ich habe einige Zeit lang mein Geld primär mit Perl verdient. Und eines Tages hat meine Freundin spaßhalber einfach ein paar von den Zeichen die sie in meinen Programmen gesehen hatte (viele $s, viele @s viele [], viele /foo/s etc) genommen, augenzwinkernd gemeint das könne sie auch und ohne es zu wissen ein funktionierendes fünfzeiliges Perl-Programm geschriebem. 😃

    (Hat zwar nichts ausgegeben weil es nur ein paar Array-Teile in den Pattern-Space kopiert hat, war aber völlig legaler Code; wie ich erschüttert feststellen musste.)

    ROFL 😃 👍

    Das erinnert mich direkt an**

    for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
    

    **:D



  • @nman

    Also das Hauptproblem ist erstmal, das regex doch nicht zu 100 Prozent alles kann was mit regular expressions möglich ist (z.B. \i zum ignorieren von Groß-/Kleinschreibung). Dort muß halt ein anderer Parmeter beim Aufruf von regex_replace und co. angegeben werden.

    Zur Aufgebenstellung:

    Das Fileformat was ich gerne Hätte ist:
    last=Nachname
    first=Vorname
    dob=Geburtsdatum
    id=Pat.Id

    Nun liegt mir aber ein File vor wo die Keys für die Eingabe anders sind:

    3301:Nachname
    3600:Vorname
    4400:Geburtsdatum
    7769:Pat.Id

    Mein derzeitiges Vorgehen wäre jeweils mit regex für jede Zeile:

    regex_replace( string("3301:"), e, string("last"), boost::match_default | boost::format_sed);

    Das halt für jeden Key - fertig. Aber das ist eben nicht sonderlich schön -> mit meinem bisherigen Vorgehen mit normalen std::string mache ich ja nichts anderes, also kein wirklich Vorteil mit regex 😞 .
    Ein wirklicher Vorteil wäre es wenn ich das in eine regular Expression verpacken könnte. Ich hab schon mit back references rumprobiert, aber irgendwie frißt er die auch nicht. Es geht mir ja nicht nur darum das Problem nochmal zu lösen es soll schon wirklich "schöner" sein 🙂 .


Anmelden zum Antworten