我有一个这样的字符串:
“\ 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"
。
答案 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::string
是data
,data(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"));