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.