2010-06-26 9 views
13

Wenn ich ein einfaches Regex-Muster wie "AB." und ich habe eine Zeichenfolge, die mehrere Übereinstimmungen wie "abc abd" hat. Wenn ich Folgendes tue ...Boost C++ Regex - wie mehrere Übereinstimmungen zu bekommen

boost::match_flag_type flags = boost::match_default; 
boost::cmatch mcMatch; 
boost::regex_search("abc abd", mcMatch, "ab.", flags) 

Dann enthält mcMatch nur das erste "abc" Ergebnis. Wie kann ich alle möglichen Übereinstimmungen erhalten?

Antwort

25

Sie können die boost::sregex_token_iterator wie in diesem kurzen Beispiel verwenden:

#include <boost/regex.hpp> 
#include <iostream> 
#include <string> 

int main() { 
    std::string text("abc abd"); 
    boost::regex regex("ab."); 

    boost::sregex_token_iterator iter(text.begin(), text.end(), regex, 0); 
    boost::sregex_token_iterator end; 

    for(; iter != end; ++iter) { 
     std::cout<<*iter<<'\n'; 
    } 

    return 0; 
} 

Die Ausgabe dieses Programms lautet:

abc 
abd 
+0

Vielen Dank für die schnelle Antwort. Frage, was kommt * iter zurück, scheint es in meinem Schnelltest kein boost :: cmatch zu sein? Ich habe nur ein sehr einfaches Beispiel gegeben. In meiner Regex kann ich Gruppen haben, also brauche ich Zugang zu den Gruppeninformationen für jedes Match (wie von cmatch verfügbar)? – Ron

+0

Sie könnten stattdessen den regex_iterator ausprobieren, er gibt ein match_result zurück, wenn dereferenziert wird, und sollte Ihnen geben, wonach Sie suchen? – Jacob

Verwandte Themen