Bonjour,

Je me penche actuellement sur la bibliothèque Boost::Spirit. J'avance doucement mais je bute sur un problème : j'ai une chaine de caractères pouvant contenir le texte suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
std::string s = "{Clavier,Azerty, Qwerty}";
Mon objectif est de récupérer chaque valeur est de les placer dans un std::vector. Avec le texte ci-dessus, pas de souci. Par contre, si le texte est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
std::string s = "{'Clavier FR',Azerty, Qwerty}";
... je récupère bien les valeurs mais je perds l'espace de la valeur 'Clavier FR'

Comment faire ?


Voici le bout de code sur lequel je travaille :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
 
#define BOOST_SPIRIT_USE_PHOENIX_V3
 
using namespace boost::spirit;
 
template <typename Iterator, typename Skipper>
struct pg_string_array_grammar : qi::grammar<Iterator, std::vector<std::string>(), Skipper>
{
    pg_string_array_grammar() : pg_string_array_grammar::base_type{strings_}
    {
        string_        = *ascii::alnum;
        quoted_string_ = "'" >> string_ >> "'";
        strings_       = "{" >> ((quoted_string_ | string_ ) % ",") >> "}";
    }
 
    qi::rule<Iterator, std::string(), Skipper>              string_;
    qi::rule<Iterator, std::string(), Skipper>              quoted_string_;
    qi::rule<Iterator, std::vector<std::string>(), Skipper> strings_;
};
 
int main()
{
    //std::string s1{"{'azerty',toto,titi tata,'qwerty','clavier','clavier us'}"};
    std::string s1{"{'azerty', 'clavier fr'}"};
    //std::string s1{"{'azerty', 'clavier'}"};
    std::vector<std::string> v1;
 
    pg_string_array_grammar<std::string::iterator, qi::space_type> g1;
 
    if (qi::phrase_parse(s1.begin(), s1.end(), g1, qi::space_type(), v1))
    {
        for (const auto &elem : v1)
            std::cout << elem << std::endl;
    }
}
Merci d'avance,

Jean-Michel