2014-09-01 7 views
5

Ich verwende VS2010 und Codierung C++ Konsolenanwendung und vor dem ProblemWas stimmt nicht mit regex_match? sehr einfacher Ausdruck

#include <regex> 
using namespace std; 

//... 

if (!regex_match("abab",regex("(ab?)*"))) 
{ 
    //the problem is - why we are here? why it doesn't match? 
} 

hier http://regexpal.com/ geprüft - sie paßt

+5

Viele Implementierungen der Bibliothek für reguläre Ausdrücke sind skizzenhaft, besonders in VS 2010. Denken Sie daran, dass VS 2010 kein C++ 11-Compiler ist, sondern einfach _some_ C++ 11-Funktionen unterstützt. –

+0

@CaptainObvlious du hast Recht !! Ich teste es in VS2012, so ist die Regex für mich abgestimmt. –

+0

[Arbeitet mit gcc] (http://coliru.stacked-crooked.com/a/65f607082de2cc06). –

Antwort

0

Ganz einfach: regex_match nur wahr, wenn die gesamte Sequenz angepasst wird. Sie können regex_search verwenden, wenn Sie sehen möchten, ob eine Zeichenfolge Ihre Regex enthält.

"ab?" Matches "aba", der Repeater ("(*)") machen dieses Match einmal. Der Rest ist "b", also ist es kein vollständiges Spiel.

Es tut mir leid, ich habe die Regex falsch gelesen. Es sollte ein volles Match sein. Seltsam genug:

regex_match("aab", regex("(ab?)*")) == true 

Scheint ein Bug im stl verwendet werden (getestet mit QT Creator 2010,05, makespec = VS2010). Ersetzen von regex_match durch regex_search in Ihrem Code entspricht dem Recht, aber die Ergebnisse von match_results sind leer - was darauf hindeutet, dass noch etwas schief läuft.

Mit VS2012 stimmen alle Tests korrekt überein.