2009-12-09 5 views
1

J'ai plusieurs expressions regex, chacune mappée à un objet différent. Après avoir passé une chaîne, je veux faire une boucle sur chaque expression regex jusqu'à ce que l'on évalue à vrai, alors je voudrais retourner l'objet mappé.C++ implémentation d'une carte regex

Quelle est la meilleure façon de l'implémenter en C++? Y at-il un objet boost disponible pour cela?

Répondre

2

L'approche la plus simple est probablement la meilleure.

vector<pair<regex,Object>> regexes; 

Object* find_it(string looking_for) 
{ 
    auto found = find_if(regexes, [&](const pair<regex,Object>& thing) 
     { 
      return get<0>(thing).match(looking_for); 
     } 

    if(found != regexes.end()) return & get<1>(*found); 

    return nullptr; 
} 

Mais, l'approche simple n'est jamais une réponse amusante. Si vous utilisez un Trie, vous pouvez essentiellement rechercher rapidement des regex du style <prefix>.*. Avec un peu d'imagination, vous serez peut-être capable de trouver du temps pour rechercher des expressions rationnelles un peu plus expressives. Cependant, je doute que vous pourriez transformer un trie pour gérer efficacement les regex générales. Mais ça pourrait être amusant de ... trie :).

1

En supposant que vous ayez un vecteur (ou un autre conteneur) de ces objets contenant les regex, vous pouvez le faire avec un std::find_if call. La partie délicate écrit le foncteur de prédicat correct.

+0

Si écrire le prédicat est délicat, pourquoi même suggérer cette solution? –

+0

wow neil plutôt snarky aujourd'hui! es-tu ivre? –

+0

Non. Puis-je m'attendre à ce que vous ou Dan fournisse le prédicat délicat? –