2015-06-29 10 views
6

Ich studiere reguläre Ausdrücke in C++ 11 und diese Regex-Suche gibt false zurück. Weiß jemand, was ich hier falsch mache? . Ich weiß, dass .* für eine beliebige Anzahl von Zeichen außer Zeilenumbrüche steht.Regex funktioniert nicht wie erwartet mit C++ regex_match

Also erwartete ich, dass regex_match() true zurückgibt und die Ausgabe "gefunden" wird. Die Ausgabe wird jedoch als "nicht gefunden" ausgegeben.

#include<regex> 
#include<iostream> 

using namespace std; 

int main() 
{ 
    bool found = regex_match("<html>",regex("h.*l"));// works for "<.*>" 
    cout<<(found?"found":"not found"); 
    return 0; 
} 
+0

Welche Version des Compilers verwenden Sie? Einige Versionen von GCC unterstützen C++ 11 aber nicht vollständig Regex – Brahim

+0

die Frage wurde beantwortet regex_match funktioniert nicht für Subsequenzen –

Antwort

11

Sie müssen verwenden regex_search statt regex_match:

bool found = regex_search("<html>",regex("h.*l")); 

Siehe IDEONE demo

In einfachen Worten, regex_search bei nach einem Teil sucht jede Position in der angegebenen Zeichenfolge zurück. regex_match gibt nur wahr zurück, wenn die gesamte Eingabezeichenfolge übereinstimmt (dasselbe Verhalten wie matches in Java).

Die regex_match Dokumentation sagt:

Gibt zurück, ob die Zielsequenz rgx den regulären Ausdruck übereinstimmt.
Die gesamte Zielsequenz muss mit dem regulären Ausdruck für diese Funktion übereinstimmen, um true zurückzugeben (d. H. Ohne zusätzliche Zeichen vor oder nach der Übereinstimmung). Für eine Funktion, die true zurückgibt, wenn die Übereinstimmung nur ein Teil der> Sequenz ist, siehe regex_search.

Die regex_search ist anders:

Gibt zurück, ob einige Untersequenz in der Zielsequenz (das Thema) den regulären Ausdruck rgx (das Muster).

+0

Oh, ich sehe danke für die Erklärung –

Verwandte Themen