C++ 解析字符串以创建元素列表
我有这样一个字符串: “\r color=\“red\”name=\“Jon\”\t\n depth=\“8.26” 我想解析这个字符串并创建这个对象的C++ 解析字符串以创建元素列表,c++,string,string-parsing,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(
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]));
}
);
}
向量标记;
分割(标记str是(“\t\f\v\n\r”)的任意一个);
if(tokens.size()>1)
{
列表属性;
对于每个(tokens.begin()、tokens.end()、[&attr](常量字符串和标记)
{
if(token.empty()| |!包含(token,“=”))
返回;
向量标记;
分割(令牌,令牌,是(“=”)的任意一个);
擦除所有(标记[1],“\”);
属性推回(数据(令牌[0],令牌[1]);
}
);
}
但是,如果编辑后
”
:如color=“red 1”
,中有空格,则该选项无效:
对于空间问题,可以执行以下操作:
(将不在“”引号内的所有空格替换为\n)
假设
名称
前至少有一个空格,我认为以下算法足够快:
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)));
}
正如你所见,没有必要使用boost或regex,只是标准库。写得最快,编译得最快,或者运行时最快?获得自我意识最快?我不想为
家庭作业
答案编写实际的代码,但如果是我,我会使用or.Qi。简单地说,这需要工作。你试过什么您可以使用boost,也可以使用boost.Tokenizer。不过,您可能需要对输入字符串进行预处理以清除转义序列。@尼克:回答这个问题就是为您编写实际的代码。.-]Pendantic,但从C++11开始,regex是标准库的一部分。:-]
PrepareForTokanization(str);
split(tokens, str, is_any_of("\t\f\v\n\r"));
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)));
}
data(string name, string value)
: name(name), value(value)
{ }