2012-10-27 2 views
1

Je travaille sur quelque chose de similaire à un moteur de template pour C++. En utilisant la bibliothèque standard <regex>, comment puis-je trouver plusieurs correspondances dans une chaîne qui a ce modèle: AB $1 BA (ne fonctionne pas avec le caractère d'échappement sur AB, est \AB, mais fonctionne avec tout autre caractère avant AB) et stocker les correspondances dans un vecteur de chaîne?Comment faire une chaîne regex remplacer avec 1 variable?

Par exemple:

string main_string = "Something cool \AB blabla BA, something else AB first BA, something AB second BA more."; 
vector<string> matches; 
// algorithm here 

et les matches doivent contenir first et second.

Répondre

0
#include <string> 
#include <regex> 
#include <vector> 
#include <iostream> 

int main() { 
    std::string target_text(
     "Something cool \\AB blabla BA, something else AB first BA, " 
     "something AB second BA more."); 
    std::vector<std::string> result; 
    typedef std::string::const_iterator iter_type; 
    std::regex rgx("[^\\\\]AB(.*?)BA"); 
    std::regex_iterator<iter_type> iter(target_text.begin(), 
             target_text.end(), 
             rgx); 
    std::regex_iterator<iter_type> end; 
    for (; iter != end; ++iter) 
     result.push_back((*iter)[1].str()); 
    for (int i = 0; i < result.size(); ++i) 
     std::cout << result[i] << '\n'; 
    return 0; 
} 

L'expression régulière n'a pas tout à fait raison; il ne correspondra pas "ABcBA", car il insiste sur un caractère (pas une barre oblique inverse) immédiatement avant le reste du motif. C'est corrigible avec une assertion négative à la place du groupe de caractères, mais le test simple que j'ai essayé n'a pas fonctionné et je ne veux pas y mettre plus de temps maintenant.

Questions connexes