提升精神:如何将值对的字符串解析为map <string,string =“”>并返回?</string,>

时间:2011-07-22 11:45:59

标签: c++ parsing boost boost-spirit

所以有一个像remixsettings_bits=1; wysiwyg=1,2,3,abc; remixclosed_tabs=0; remixgroup_closed_tabs=786432; remixlang=0; remixchk=5; remixsid=35d4f9907281708019490d07728c27ca5c10e5de7a869c322222225e3219e; audio_vol=100 这样的字符串我想知道如何解析tham到map name&lt; - &gt; value使用boost :: spirit而不是能够使用boost :: spirit写回来?

更新 的 所以我做了什么:

#include <iostream>
#include <sstream>
#include <string>
#include <map>
//...

std::map<std::string, std::string> user_control::parse_cookie( std::string cookie_data )
{
    std::map<std::string, std::string> parsed_cookie;
    std::string token, token2;
    std::istringstream iss(cookie_data);
    while ( getline(iss, token, ' ') )
    {
        std::string name, val;
        std::istringstream iss2(token);
        int num = 0 ;
        while ( getline(iss2, token2, '=') )
        {
            if ( num == 0)
            {
                name = token2;
                num++;
            }
            else
            {
                val = token2;
                std::string::iterator it = val.end() - 1;
                if (*it == ';')
                    val.erase(it);

            }
        }
        std::cout << "name: " << name <<  " value: " << val << std::endl;
        parsed_cookie.insert(std::pair<std::string, std::string>(name, val));
    }
    return parsed_cookie;
}

但我真的很想知道如何将我的代码移植到boost :: spirit代码中。

2 个答案:

答案 0 :(得分:6)

这应该可以解决问题,解析对并使用Karma打印结果,尽管我们可能都应该阅读Hartmut的文章!

#include <boost/spirit/include/qi.hpp>         // Parsing
#include <boost/spirit/include/karma.hpp>      // Generation
#include <boost/fusion/adapted/std_pair.hpp>   // Make std::pair a fusion vector

int main( int argc, char**argv)
{
  using namespace boost::spirit;
  std::string str = "keyA=value1; keyB=value2;keyC=value3;";

  std::map<std::string,std::string> contents;
  std::string::iterator first = str.begin();
  std::string::iterator last  = str.end();

  const bool result = qi::phrase_parse(first,last, 
   *( *(qi::char_-"=")  >> qi::lit("=") >> *(qi::char_-";") >> -qi::lit(";") ),
    ascii::space, contents);                                  

  assert(result && first==last);

  std::cout << karma::format(*(karma::string << '=' <<
               karma::string << karma::eol), contents);
}

答案 1 :(得分:3)

您看过this parser articlethis generator article了吗? AFAICT,他们确切地解释了你想要做的事情。