2

我有一个这样的字符串:

"\r 颜色=\"红色\" 名称=\"乔恩\" \t\n 深度=\"8.26\" "

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

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

例如:

name = color
value = red

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

编辑:

这是我尝试过的:

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]));
        }
    );
}

但是如果里面有空格就不行了" ":like color="red 1".

4

2 回答 2

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::string并且data有这种类型的构造函数:

data(string name, string value)
    : name(name), value(value)
{   }

如您所见,无需使用 boost 或 regex,只需使用标准库即可。

于 2012-07-03T17:47:49.030 回答
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 之前,准备好字符串,然后从 split is_any_of 中删除空格字符

PrepareForTokanization(str);
split(tokens, str, is_any_of("\t\f\v\n\r"));
于 2012-07-02T21:33:32.180 回答