Regex in C++



  • Hallo,

    ich habe hier folgenden Quelltext:

    #include <stdio.h>
    #include <regex>
    #include <string>
    
    using namespace std;
    
    main()
    {
    	string Mnemonic("mov [bx+si], al");
    	regex Regex("(\\w+) ?(?:(?:\[(?:(\\w+)\\:)?(\\w+\\+?\\w+?)\]|(\\w+)), ?(?:\[(\\w+)\]|(\\w+)))?");
    	cmatch Result;
    
    	regex_search( Mnemonic.c_str(), Result, Regex );
        for( size_t nr=1; nr<=Result.size(); ++nr ) printf("%s", Result[nr]);
    }
    

    Beim Compilieren alles gut und schön außer folgende Warnung:

    Warnung: Format »%s« erwartet Argumenttyp »char*«, aber Argument 2 hat Typ »const value_type {aka const std::sub_match<const char*>}« [-Wformat]
    

    Beim Ausführen erhalte ich aber

    terminate called after throwing an instance of 'std::regex_error'
      what():  regex_error
    Abgebrochen (Speicherabzug geschrieben)
    

    Woran kann das liegen?

    Gruß Uwe



  • Warum nutzt du printf?!



  • wenn du printf nutzen möchtest, mußt du einen const char * übergeben:

    for( size_t nr=1; nr<=Result.size(); ++nr ) printf("%s", Result[nr].str().c_str());
    


  • Fehhler nach dem Ausführen bleibt immer noch.



  • probier mal

    const char * Mnemonic = "mov [bx+si], al";
    

    in der Zeile

    regex_search( Mnemonic.c_str(), Result, Regex );
    

    wird bei Mnemonic.c_str() ein const char * zurückgegeben, der möglicherweise nicht dauerhaft ist



  • Ist doch ganz klar, der Fehler muss von

    regex Regex("(\\w+) ?(?:(?:\[(?:(\\w+)\\:)?(\\w+\\+?\\w+?)\]|(\\w+)), ?(?:\[(\\w+)\]|(\\w+)))?");
    

    kommen, d.h. der Regex hat einen Fehler.

    Da C++11 Raw String Literals kennt, würde ich den Regex gleich in so einem schreiben, in der jetzigen Form finde ich ihn etwas unleserlich.


Anmelden zum Antworten