Comment faire correspondre plusieurs résultats en utilisant std :: regex

par exemple.Si j’ai une chaîne du type “premier deuxième tiers” et je veux faire correspondre chaque mot en une opération à output’em un à un.

Je pensais juste que “(\ b \ S * \ b) {0,}” fonctionnerait. Mais en réalité, cela ne fonctionnait pas.

Que devrais-je faire?

Voici mon code:

#include #include using namespace std; int main() { regex exp("(\\b\\S*\\b)"); smatch res; ssortingng str = "first second third forth"; regex_search(str, res, exp); cout << res[0] <<" "<<res[1]<<" "<<res[2]<<" "<<res[3]<< endl; } 

Je suis impatient de recevoir votre aide. 🙂

Cela peut être fait dans les regex de C++11 .

Deux methos:

  1. Vous pouvez utiliser () dans regex pour définir vos captures.

    Comme ça:

     ssortingng var = "first second third forth"; const regex r("(.*) (.*) (.*) (.*)"); smatch sm; if (regex_search(var, sm, r)) { for (int i=1; i 

    Voir en direct: http://coliru.stacked-crooked.com/a/e1447c4cff9ea3e7

  2. Vous pouvez utiliser sregex_token_iterator() :

     ssortingng var = "first second third forth"; regex wsaq_re("\\s+"); copy( sregex_token_iterator(var.begin(), var.end(), wsaq_re, -1), sregex_token_iterator(), ostream_iterator(cout, "\n")); 

    Voir en direct: http://coliru.stacked-crooked.com/a/677aa6f0bb0612f0

Il suffit de parcourir votre chaîne pendant que vous utilisez regex_searching, comme ceci:

 { regex exp("(\\b\\S*\\b)"); smatch res; ssortingng str = "first second third forth"; ssortingng::const_iterator searchStart( str.cbegin() ); while ( regex_search( searchStart, str.cend(), res, exp ) ) { cout << ( searchStart == str.cbegin() ? "" : " " ) << res[0]; searchStart += res.position() + res.length(); } cout << endl; } 

Vous pouvez utiliser la fonction suffixe () et effectuer une nouvelle recherche jusqu’à ce que vous ne trouviez pas de correspondance:

 int main() { regex exp("(\\b\\S*\\b)"); smatch res; ssortingng str = "first second third forth"; while (regex_search(str, res, exp)) { cout << res[0] << endl; str = res.suffix(); } } 

n’hésitez pas à utiliser mon code. Il va capturer tous les groupes dans tous les matches:

 vector> U::Ssortingng::findEx(const ssortingng& s, const ssortingng& reg_ex, bool case_sensitive) { regex rx(reg_ex, case_sensitive ? regex_constants::icase : 0); vector> captured_groups; vector captured_subgroups; const std::sregex_token_iterator end_i; for (std::sregex_token_iterator i(s.cbegin(), s.cend(), rx); i != end_i; ++i) { captured_subgroups.clear(); ssortingng group = *i; smatch res; if(regex_search(group, res, rx)) { for(unsigned i=0; i 0) captured_groups.push_back(captured_subgroups); } } captured_groups.push_back(captured_subgroups); return captured_groups; } 

Ma lecture de la documentation est que regex_search recherche la première correspondance et qu’aucune des fonctions de std::regex ne “effectue” un “scan” comme vous le souhaitez. Cependant, la bibliothèque Boost semble supporter cela, comme décrit dans C ++ tokeniser une chaîne en utilisant une expression régulière

sregex_token_iterator semble être la solution idéale et efficace, mais l’exemple donné dans la réponse sélectionnée laisse beaucoup à désirer. Au lieu de cela, j’ai trouvé quelques excellents exemples ici: http://www.cplusplus.com/reference/regex/regex_token_iterator/regex_token_iterator/

Pour votre commodité, j’ai copié et collé le code exemple affiché par cette page. Je ne revendique aucun crédit pour le code.

 // regex_token_iterator example #include  #include  #include  int main () { std::ssortingng s ("this subject has a submarine as a subsequence"); std::regex e ("\\b(sub)([^ ]*)"); // matches words beginning by "sub" // default constructor = end-of-sequence: std::regex_token_iterator rend; std::cout << "entire matches:"; std::regex_token_iterator a ( s.begin(), s.end(), e ); while (a!=rend) std::cout << " [" << *a++ << "]"; std::cout << std::endl; std::cout << "2nd submatches:"; std::regex_token_iterator b ( s.begin(), s.end(), e, 2 ); while (b!=rend) std::cout << " [" << *b++ << "]"; std::cout << std::endl; std::cout << "1st and 2nd submatches:"; int submatches[] = { 1, 2 }; std::regex_token_iterator c ( s.begin(), s.end(), e, submatches ); while (c!=rend) std::cout << " [" << *c++ << "]"; std::cout << std::endl; std::cout << "matches as splitters:"; std::regex_token_iterator d ( s.begin(), s.end(), e, -1 ); while (d!=rend) std::cout << " [" << *d++ << "]"; std::cout << std::endl; return 0; } Output: entire matches: [subject] [submarine] [subsequence] 2nd submatches: [ject] [marine] [sequence] 1st and 2nd submatches: [sub] [ject] [sub] [marine] [sub] [sequence] matches as splitters: [this ] [ has a ] [ as a ]