2012-05-11 2 views
5

Ich bin neu in regulären C++ - Ausdrücken und kann sie nicht mit Zeichenfolgen anstelle von char * arbeiten lassen. Die Beispiele, die ich bisher gesehen habe, waren immer für c-Saiten.Warum löst ein C++ - Code für reguläre Ausdrücke, der mit "cmatch" arbeitet, eine Ausnahme mit "smatch" aus?

Mein richtiges Programm, das ich hier nicht einmal versuchen werde, verwendet Sub-Matches, aber ich konnte nicht funktionieren , also habe ich versucht, ein sehr einfaches Arbeitsbeispiel zu ändern, aber es funktioniert auch nicht. Ich verwende Visual Studio 2010 Ultimate.

Das Original - Arbeiten - Code:

const char *first = "abcd"; 
const char *last = first + strlen(first); 
std::cmatch mr; 
std::regex rx("abc"); 
std::regex_constants::match_flag_type fl = std::regex_constants::match_default; 

std::cout << "search(f, l, \"abc\") == " << std::boolalpha 
      << regex_search(first, last, mr, rx) << std::endl; 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha 
      << regex_search("xabcd", mr, rx) << std::endl; 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

Der modifizierte Code:

const string first = "abcd";  // char * => string 
std::smatch mr;     // cmatch => smatch 
std::regex rx(string("abc")); 
std::regex_constants::match_flag_type fl = std::regex_constants::match_default; 

       // this works: 
std::cout << "search(f, l, \"abc\") == " << std::boolalpha 
      << regex_search(first, mr, rx) << std::endl; 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

       // after the next line executes mr seems good to me: 
       // mr[0] = {3, matched:true, first="abcd", second="d",...} 
std::cout << "search(\"xabcd\", \"abc\") == " << std::boolalpha 
      << regex_search(string("xabcd"), mr, rx) << std::endl; 
       // but the following line gives the error 
       // "Debug assertion failed" 
       // Expression: string iterators incompatible 
std::cout << " matched: \"" << mr.str() << "\"" << std::endl; 

Seltsam, dass ein Teil des modifizierten Code funktioniert, während der nächste Teil eine Ausnahme verursacht. Ich habe sogar versucht, mr [0] .str() zu verwenden, aber ich habe dieselbe Fehlermeldung erhalten. Könnten Sie mir helfen, dieses Problem zu lösen?

Antwort

10

Das Problem ist eines der Provisorien.

smatch enthält Iteratoren in die Zeichenfolge, nach der Sie suchen.

regex_search(string("xabcd"), mr, rx) erstellt eine temporäre Zeichenfolge, die am ; stirbt.

Wenn Sie also in der nächsten Zeile mr verwenden, bezieht sich dies auf den ungültigen Speicher. Die string sollte länger als mr leben.

+0

Vielen Dank! Ich sehe, ich habe das nicht durchdacht. Dies erklärt auch vollständig, warum mein ursprünglicher Code abstürzt. – afalco

Verwandte Themen