Boost Regex Search



  • Hallo,

    seit dem CBuilder 2010 funktioniert meine alte Reguläre Ausdrucks Komponente nicht mehr und ich muss eine neue finden oder schreiben. Da ich nichts fertiges gefunden habe, wollte ich Boost:Regex nehmen. In der Theorie nach kurzer Einarbeitung auch alles klar. Doch leider scheinen die Prüfungen zum großteil unverständlicher Weise nicht hinzuhauen. Das Beispiel hier unten zeigt eindrucksvoll was passiert. Es soll einfach in "Str" nach Zahlenkollonnen gesucht werden (ist hier nur ein Beispiel,da es ums Prinzip geht). Der Quellcode hier unten ist im Kern offiziellen Beispielen entlehnt. nehmen wir jetzt als regulären Ausdruck die Zeile
    "boost::regex expression("([0-9])");",
    also suche mir nur nach einer Zahl funktioniert es und das Programm gibt alle Zahlen aus. Sagen wir wir nehmen
    "boost::regex expression("(26)");",
    dann findet er die 26 auch. Nehme ich aber:
    "boost::regex expression("([0-9]*)");",
    möchte also nach einer beliebig langen Zahlenkette suchen, läuft der Scan in einer Endlosschleife fest.

    Soweit gibt es einige Konstellationen, welche einfach nicht die Scan Ergebnisse bringen mit der Boost Bibliothek, die es offiziell geben müsste. Ich suche schon seit einer Woche und werde bald wahnsinnig...

    Hat Jemand ähnliche Probleme oder kann mir jemand eine funktionierende, logische Bibliothek für reguläre Ausdrücke und einen relativ neuen C++ Builder nennen? Sie kann auch was kosten, das ist egal...

    Vielen Dank

    // Eingabe-String
    std::string Str="Text26Text31";

    std::string::const_iterator start, end;
    boost::match_resultsstd::string::const\_iterator what;
    boost::match_flag_type flags = boost::match_default|boost::match_partial;

    // regulärer Prüfausdruck
    // boost::regex expression("([0-9]*)");
    boost::regex expression("([0-9])");

    start = Str.begin();
    end = Str.end();

    // matches suchen
    while(boost::regex_search(start, end, what, expression, flags))
    {
    ShowMessage(what[1].str().c_str());

    start=what[0].second;
    }



  • Hab das Problem erst mal gefunden. Und zwar handelte es sich bei dem Zeichen * ja um entweder kein oder mehrere Zeichen. und [0-9]* bedeutet eben auch eine Leere Zeichenkette. Mein altes Modul hat das aber als falsche Überprüfung ausgewertet... Wenn man das durch ein + ersetzt, dann funktioniert es...



  • chrismasterlu schrieb:

    seit dem CBuilder 2010 funktioniert meine alte Reguläre Ausdrucks Komponente nicht mehr

    Wie heißt sie denn? Hast du nachgesehen, ob es möglicherweise eine aktuellere Version gibt?

    chrismasterlu schrieb:

    Da ich nichts fertiges gefunden habe

    ... hast du nicht richtig gesucht 😉

    Ich habe bisher mit den Regex-Komponenten aus der JCL sowie TPerlRegEx gute Erfahrungen gemacht; sie greifen beide auf CBDE zurück.


Anmelden zum Antworten