2008-12-13 8 views
3

J'ai des problèmes avec Boost.Spirit l'analyse d'une chaîne.booster l'esprit extraire le premier mot et le stocker dans un vecteur

La chaîne ressemble

name1 has this and that.\n 
name 2 has this and that.\n 
na me has this and that.\n 

et je dois extraire les noms. Le texte "a ceci et cela" est toujours le même mais le nom peut être constitué d'espaces donc je ne peux pas utiliser graph_p.

1) Comment analyser une telle chaîne?

Étant donné que la chaîne a plusieurs lignes de ce format, je dois stocker les noms dans un vecteur.

J'utilise quelque chose comme

std::string name; 
rule<> r = *graph_p[append(name)]; 

pour sauver un nom mais

2) quelle est la meilleure façon d'enregistrer plusieurs noms dans un vecteur?

Merci à l'avance

Konrad

Répondre

0

Je présume qu'il ya une raison pour laquelle vous utilisez Boost.Spirit et non STL méthode de find 's string'? Par exemple:

string s = "na me has this and that.\n"; 
myVector . push_back(s.substr(0, s.find("has this and that"))); 
4

Je pense que cela va faire l'affaire:

vector<string> names; 
string name; 
parse(str, 
    *( 
     (*(anychar_p - "has this and that.")) [assign_a(name)] 
     >> "has this and that.\n") [push_back_a(names, name)] 
    )) 
+0

+1. Propre et simple! –

2

Si vous utilisez le plus récent Esprit V2.x (qui est la valeur par défaut depuis Boost v1.42), cela est aussi facile que :

#include <boost/spirit/include/qi.hpp> 

namespace qi = boost::spirit::qi; 

std::vector<std::string> names; 
std::string input = "name1 has this and that.\n" 
        "name 2 has this and that.\n" 
        "na me has this and that.\n"; 
bool result = qi::parse(
    input.begin(), input.end(), 
    *(*(qi::char_ - " has this and that.\n") >> " has this and that.\n"), 
    names 
); 

Après quoi, si result est true, le vecteur names tiendra tous les noms analysables (testé avec Boost v1.45).

0

Pour supprimer le "a ceci et que" l'utilisation:

qi::lit("has this and that")