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

Parse string to create a list of element

本文关键字:元素 列表 创建 字符串      更新时间:2023-10-16

我有一个这样的字符串:

"\r 颜色=\"红色\" 名称="乔恩" \t 深度=\"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(" tfvnr"));
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".

假设在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(" tnvfr", fv);
    l.push_back(data(str.substr(++fn, fv-fn-2), str.substr(++fv, lv-fv)));
}

其中str是你的std::stringdata有一个这种类型的构造函数:

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

如您所见,无需使用 boost 或正则表达式,只需使用标准库即可。

编辑

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

(将不在 " " 引号内的所有空格替换为 )

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';
    }
}

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

PrepareForTokanization(str);
split(tokens, str, is_any_of("tfvnr"));