2015-06-18 14 views
5

Ich schrieb das folgende einfache Beispiel:Verständnis C++ regex durch ein einfaches Beispiel

#include <iostream> 
#include <string> 
#include <regex> 

int main() 
{ 
    std::string str("1231"); 
    std::regex r("^(\\d)"); 
    std::smatch m; 
    std::regex_search(str, m, r); 
    for(auto v: m) std::cout << v << std::endl; 
} 

DEMO

und verlor sein Verhalten verwirrt. Wenn ich den Zweck der match_result von there richtig verstanden habe, sollte die einzige 1 gedruckt worden sein. Tatsächlich:

Wenn dies gelingt, ist es nicht leer und enthält eine Reihe von sub_match Objekten: das erste sub_match Element entspricht das gesamte Spiel, und, wenn der reguläre Ausdruck enthaltenen Unterausdrücke angepasst werden ([...])

die Zeichenfolge an die Funktion übergeben nicht die Regex, deshalb sollten wir nicht haben the entire match hatte.

Was habe ich vermisst?

+2

Sie erhalten immer noch die * gesamte Übereinstimmung *, aber die * gesamte Übereinstimmung * passt nicht zur * gesamten Zeichenkette * sie passt zur * gesamten Regex *. – Galik

Antwort

5

Sie erhalten immer noch das gesamten Spiel, aber die gesamte Spiel die gesamte Zeichenfolge nicht sie paßt den gesamten Regex paßt.

Zum Beispiel betrachten dies:

#include <iostream> 
#include <string> 
#include <regex> 

int main() 
{ 
    std::string str("1231"); 
    std::regex r("^(\\d)\\d"); // entire match will be 2 numbers 
    std::smatch m; 
    std::regex_search(str, m, r); 
    for(auto v: m) std::cout << v << std::endl; 
} 

Ausgang:

12 
1 

Die gesamte Spiel (erste sub_match) ist, was die gesamte Regex Begegnungen gegen (Teil der Zeichenfolge).

Der zweite sub_match ist das erste (und einzige) Capture-Gruppe

bei Ihrer ursprünglichen regex Suche

std::regex r("^(\\d)"); 
       |----| <- entire expression (sub_match #0) 

std::regex r("^(\\d)"); 
       |---| <- first capture group (sub_match #1) 

Das ist, wo die beiden sub_matches kommen.

+0

So schüchtern habe ich das gleiche Ergebnis [da] (http://coliru.stacked-crooked.com/a/f60dc6ddd65321de) bekommen? Wir haben zwei 1 Zeichen. –

+0

@DmitryBundin Die erste Sub_Match ist die gesamte Regex, die zweite Sub_Match ist nur der Teil der Regex, die in Parens '(\\ d)' ist. Es passiert einfach, dass du den ganzen Regex in Parens legst. – Galik

+0

Sucht die Funktion nach der ersten Übereinstimmung und stoppt sie, wenn sie eine findet? –

1

Von here

Returns whether **some** sub-sequence in the target sequence (the subject) 
    matches the regular expression rgx (the pattern). The target sequence is 
    either s or the character sequence between first and last, depending on 
    the version used. 

So regex_search für alles, was in der Eingabezeichenfolge suchen, die den regulären Ausdruck übereinstimmt. Die ganze Saite muss nicht übereinstimmen, nur ein Teil davon.

Wenn Sie jedoch regex_match verwenden möchten, muss der gesamte String übereinstimmen.

+0

Warum verpacken Sie das Angebot als Code? –