2015-06-18 13 views
5

ho scritto il seguente semplice esempio:intesa C++ regex con un semplice esempio

#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

e un po 'confusa dal suo comportamento. Se ho compreso correttamente lo scopo dello match_result da there, l'unico 1 avrebbe dovuto essere stampato. Effettivamente:

caso di successo, non è vuoto e contiene una serie di sub_match oggetti: il primo elemento sub_match corrisponde all'intera partita, e, se l'espressione regex conteneva sottoespressioni da abbinare ([...])

la stringa passata alla funzione non corrisponde alla espressione regolare, pertanto si dovrebbe non hanno avuto the entire match.

Cosa mi sono perso?

+2

Si ottiene sempre * l'intera corrispondenza *, ma * l'intera corrispondenza * non si adatta * all'intera stringa * che si adatta * all'intera espressione regolare *. – Galik

risposta

5

è ancora ottenere l'intera partita ma l'intera partita non si adatta al intera stringa si inserisce l'intera regex.

Ad esempio si consideri questo:

#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; 
} 

uscita:

12 
1 

L'intera partita (prima sub_match) è ciò che i intero regex partite contro (parte della stringa).

Il secondo sub_match è il primo (e unico) gruppo di cattura

Guardando l'originale regex

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

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

Questo è dove le due sub_matches provengono.

+0

Così timido ho ottenuto lo stesso risultato [lì] (http://coliru.stacked-crooked.com/a/f60dc6ddd65321de)? Abbiamo due 1 personaggi. –

+0

@DmitryBundin Il primo sub_match è l'intera regex, il secondo sub_match è solo la parte della regex che è in parens '(\\ d)'. Accade solo che tu abbia messo l'intero regex in parentesi. – Galik

+0

La funzione cerca la prima corrispondenza e la interrompe quando ne trova una? –

1

Da 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. 

Così regex_search cercherà per qualsiasi cosa nella stringa di input che corrisponde al regex. L'intera stringa non deve corrispondere, solo una parte di essa.

Tuttavia, se si utilizza regex_match, la stringa intera corrisponde a stringa.

+0

Perché continui a racchiudere il preventivo come codice? –