Como combinar vários resultados usando std :: regex

por exemplo.Se eu tiver uma string como “primeiro segundo terceiro por diante” e eu quero combinar cada palavra em uma operação para output’em um por um.

Eu só pensei que “(\ b \ S * \ b) {0,}” iria funcionar.Mas na verdade isso não aconteceu.

O que devo fazer?

Aqui está meu código:

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

Estou ansioso para sua gentil ajuda. 🙂

Isso pode ser feito no regex do C++11 .

Dois methos:

  1. Você pode usar () no regex para definir suas capturas.

    Como isso:

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

    Veja ao vivo: http://coliru.stacked-crooked.com/a/e1447c4cff9ea3e7

  2. Você pode usar sregex_token_iterator() :

     string 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")); 

    Veja ao vivo: http://coliru.stacked-crooked.com/a/677aa6f0bb0612f0

Basta iterar sobre sua string enquanto regex_searching, assim:

 { regex exp("(\\b\\S*\\b)"); smatch res; string str = "first second third forth"; string::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; } 

Você pode usar a function suffix () e pesquisar novamente até não encontrar uma correspondência:

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

fique à vontade para usar o meu código. Ele irá capturar todos os grupos em todos os jogos:

 vector> U::String::findEx(const string& s, const string& 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(); string 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; } 

Minha leitura da documentação é que regex_search procura pela primeira correspondência e que nenhuma das funções em std::regex faz uma “varredura” como você está procurando. No entanto, a biblioteca Boost parece suportar isso, conforme descrito em C ++ para converter uma string em uma expressão regular

O sregex_token_iterator parece ser a solução ideal e eficiente, mas o exemplo dado na resposta selecionada deixa muito a desejar. Em vez disso, encontrei alguns ótimos exemplos aqui: http://www.cplusplus.com/reference/regex/regex_token_iterator/regex_token_iterator/

Para sua conveniência, copiei e colei o código de amostra mostrado por essa página. Eu não reivindico nenhum crédito pelo código.

 // regex_token_iterator example #include  #include  #include  int main () { std::string 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 ]