2011-07-22 33 views
2

所以有一個像remixsettings_bits=1; wysiwyg=1,2,3,abc; remixclosed_tabs=0; remixgroup_closed_tabs=786432; remixlang=0; remixchk=5; remixsid=35d4f9907281708019490d07728c27ca5c10e5de7a869c322222225e3219e; audio_vol=100 這樣的字符串我想知道如何使用boost :: spirit解析tham到地圖name < - >value並且能夠使用boost :: spirit將其寫回來?Boost精神:如何解析字符串值對映射到<string,string>和返回?

更新: 所以我做了什麼:

#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 ::精神的代碼。

+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); 
} 
相關問題