解析字符串以创建元素列表

时间:2012-07-02 19:55:46

标签: c++ string string-parsing

我有一个这样的字符串:

  

“\ r color = \”red \“name = \”Jon \“\ t \ n depth = \”8.26 \“”

我想解析这个字符串并创建一个std::list这个对象:

class data
{
    std::string name;
    std::string value;
};

例如:

name = color
value = red

最快的方法是什么?我可以使用boost。

编辑:

这就是我尝试过的:

vector<string> tokens;
split(tokens, str, is_any_of(" \t\f\v\n\r"));

if(tokens.size() > 1)
{
    list<data> attr;
    for_each(tokens.begin(), tokens.end(), [&attr](const string& token)
        {
            if(token.empty() || !contains(token, "="))
                return;

            vector<string> tokens;
            split(tokens, token, is_any_of("="));
            erase_all(tokens[1], "\"");
            attr.push_back(data(tokens[0], tokens[1]));
        }
    );
}

但如果" "内有空格,则无效:color="red 1"

2 个答案:

答案 0 :(得分:1)

假设在name之前总是至少有一个空格,我认为以下算法足够快:

list<data> l;
size_t fn, fv, lv = 0;

while((fv = str.find("\"", ++lv)) != string::npos &&
    (lv = str.find("\"", fv+1)) != string::npos)
{
    fn = str.find_last_of(" \t\n\v\f\r", fv);
    l.push_back(data(str.substr(++fn, fv-fn-2), str.substr(++fv, lv-fv)));
}

str std::stringdatadata(string name, string value) : name(name), value(value) { } 有这种类型的构造函数:

{{1}}

正如您所看到的,不需要使用boost或regex,只需使用标准库。

答案 1 :(得分:0)

编辑后

: 您可以针对空间问题执行以下操作:

(将所有不在“”引号内的空格替换为\ n)

void PrepareForTokanization(std::string &str)
{
    int quoteCount = 0;
    int strLen = str.length();
    for(int i=0; i<strLen; ++i){
        if (str[i] == '"' && (i==0 || (str[i-1] != '\\')))
            quoteCount++;
        if(str[i] == ' ' && quoteCount%2 == 0)
            str[i] = '\n';
    }
}

在调用split之前,准备字符串,然后从拆分中删除空格字符is_any_of

PrepareForTokanization(str);
split(tokens, str, is_any_of("\t\f\v\n\r"));