2012-04-09 11 views
4

Irgendeine Idee, warum der folgende Code "keine Übereinstimmung" druckt? Etwas mit dem Compiler oder der Version der Bibliothek verwandt? Ich habe mit g ++ a.cpp kompiliert.Probleme mit tr1/Regex. Drucke gegenüberliegend Ergebnis

#include <tr1/regex> 
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    const std::tr1::regex pattern("(\\w+day)"); 

    std::string weekend = "Saturday and Sunday"; 

    std::tr1::smatch result; 

    bool match = std::tr1::regex_search(weekend, result, pattern); 

    if(match) 
    { 
     for(size_t i = 1; i < result.size(); ++i) 
     { 
     std::cout << result[i] << std::endl; 
     } 
    }else 
    std::cout << "no match" << std::endl; 

    return 0; 
} 
+0

+1 für einen kurzen vollständigen Testfall. –

+0

der Code ist so offensichtlich, dass ich vermute, unvollständige Unterstützung des Compilers (zumindest bei meiner Version) gegenüber dem Standard. Wie kann ich dies überprüfen? – cateof

+0

Nur als Referenz - MSVC 2010 SP1 (16.00.40219.01) kompiliert und findet die Übereinstimmung richtig. Sie haben nicht die Version von GCC angegeben, die Sie verwenden. – DCoder

Antwort

0

Auf jeden Fall ein Problem mit Ihrem Compiler bekommen. Ich würde empfehlen (da Sie unter Linux sind und das macht es besonders einfach), einfach <tr1/regex> für <boost/regex.hpp> auszutauschen. Der Namespace wird auch boost:: anstelle von std::tr1:: aber alle anderen Syntax ist genau das gleiche und es kann alle Ihre Probleme lösen.

Wenn Sie Boost nicht verwenden können, ist das eine ganz andere Geschichte; Aber seit dem letzten Jahr sind die meisten Leute/Arbeitgeber/Unternehmen viel boost-freundlicher.

Beachten Sie auch, dass Ihr Testfall fehlerhaft ist. Sie haben eine Schleife, aber es wird immer nur einen einzelnen Wert gedruckt. regex_search gibt jeweils einen Wert zurück, den Sie mit dem neuen Suchstartindex aufrufen müssen, um alle Ergebnisse zu erhalten. Wenn Sie sagten, die Ausgabe des Programms sei nichts (vs "no match"), dann würde ich sagen, dass der Fehler in Ihrem Code war. Aber der Code , wie er derzeit geschrieben wird sollte "Saturday" oder "" zurückgeben.

0

Haben Sie versucht, die() zu entkommen. In einigen regexp-Implementierungen müssen Sie zum Gruppieren \( verwenden. Und du brauchst es wahrscheinlich auch nicht.

Die grundlegendste regexp hierfür wäre:

"[a-zA-Z]+day" 

Und Sie würden die Ergebnisse von result[0]

+0

immer noch "keine Übereinstimmung". Sieht einen Compiler prob aus – cateof