2017-02-10 5 views
1

Ich erhalte einen "Segmentierungsfehler", wenn ich versuche, einige reguläre Ausdrücke zu verwenden. In diesem Beispiel arbeitete der erste reguläre Ausdruck in Ordnung, aber der zweite einen Segmentation Fault erzeugt:Segmentierungsfehler C++ Regex

#include <regex> 
#include <iostream> 

using namespace std; 

void out(const string& s, const string& d,bool b) { cout << s << ", " << d << (b ? "=found" : "=not found") << endl; } 

int 
main() 
{ 
    const auto exp1 = string{"<.*>.*</.*>"}; 
    const auto reg1 = regex{exp1}; 
    const auto data1 = string{"<tag>value</tag>"}; 
    const auto found1 = regex_match(data1, reg1); 
    out(exp1, data1, found1); 

    const auto exp2 = string{"<(.*)>.*</\\1>"}; 

    cout << "About to create the regex!" << endl; 
    const auto reg2 = regex{exp2}; 
    cout << "done." << endl; 

    const auto data2 = string{"<tag>value</tag>"}; 
    const auto found2 = regex_match(data2, reg2); 
    out(exp2, data2, found2); 

    cout << "All done!" << endl; 
} 

ich kompilieren Sie es wie folgt aus:

g++ -O0 -g -Wall -Wpedantic -std=c++11 try3.cpp -o try3 

Und wenn ich es benutze ich dieses:

$ ./try3 
<.*>.*</.*>, <tag>value</tag>=found 
About to create the regex! 
Segmentation fault 

ich auf CentOS leite 5.11 Release mit libstdC++ - 4.1.2-55.el5

+0

, dass ein Problem mit der kompilierten Regex-Bibliothek ist, nicht die Regex selbst. Sie können sehen, ob es das ist, wenn Sie einen Versuch/Fang um diese Linie setzen, aber es wird nie gefangen. – sln

+0

@sln: true, ich habe es vorher mit einer try-Anweisung versucht und es fängt nichts ein. Haben Sie (oder andere) einen Workaround? –

+0

Nicht sicher, aber google das Problem, es ist wahrscheinlich entweder die lib-Version oder welche Flags wurden gesetzt, wenn kompiliert. Jemand sollte das sicher wissen. – sln

Antwort