boost::regex_replace Syntax



  • Hi,

    ich habe einen String Str, in dem ich alle Zeichen, die nicht [a-z],[A-Z] oder [0-9] sind mit einem '_' ersetzen möchte. Ich dokter nun schon einige Zeit an der Syntax für boost::regex_replace, aber bekomm keine lauffähige Version...



  • Das würde ich nicht mit einem Regex, sondern zumindest in Delphi mit Set-Operationen lösen:

    if not CharInSet (C, ['A'..'Z', 'a'..'z', '0'..'9']) then ...
    

    Vor allem deshalb, weil Set-Operationen in Delphi so schönen Code ergeben, und weil es deutlich schneller sein dürfte. Aber vielleicht ist das eine "premature optimization", und ich sollte einfach trotzdem einen Regex verwenden. Dann würde ich mal mit "[^A-Za-z0-9]{1}" beginnen und es einfach so lange auf den String anwenden, bis es keine Matches mehr gibt. (Wahrscheinlich bringt ein Aufruf der "Study"-Funktion einen relevanten Geschwindigkeitsvorteil - wenn boost.regex denn so etwas kennt.)

    Für alle, die etwas Schwierigkeiten mit dem Erstellen regulärer Ausdrücke haben, kann ich übrigens Tools wie RegexBuddy empfehlen. Damit kann man sich Regexes zusammenklicken, die Funktionsweise verstehen und sie sogar debuggen.



  • So geht's mit regex:

    boost::regex_replace(str, boost::regex("[\\W \\D]"), "_")
    

    So richtig schön finde ich regex auch nicht, weil ich meine Strings erst in den passenden Typ umwandeln muss.
    CharInSet find ich recht interessant, allerdings ist mir nicht ganz klar, wie ich unter C++ so einen Zeichensatz zusammen baue. In der Onlinehilfe steht dazu nichts...



  • Heimelchen schrieb:

    So richtig schön finde ich regex auch nicht, weil ich meine Strings erst in den passenden Typ umwandeln muss.

    Ich habe mal einen exemplarischen und etwas minimalistischen PCRE-Wrapper, der System::String verwendet, geschrieben; du findest ihn hier. Vielleicht paßt dir das besser als boost::regex (es sollte auch die Übersetzungszeit deutlich beschleunigen, da der Header nur ein paar Zeilen lang ist).


Anmelden zum Antworten