解析字符串以创建元素列表
Parse string to create a list of element
我有一个这样的字符串:
"\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::string
,data
有一个这种类型的构造函数:
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"));
相关文章:
- C++如何通过用户输入删除列表元素
- 访问类lintalizer列表中的结构元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从C++中的对列表中访问特定元素
- 访问动态分配列表中的元素
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 删除列表 c++ 中的最后 3 个元素
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 有什么方法可以将元素添加到列表中,如图所示?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 如何通过保持第一个插入的位置来对列表中插入的其余元素进行排序?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 刷新元素列表视图 QML
- SQLite:通过100K元素列表选择IN
- 解析字符串以创建元素列表
- 向vector添加可变大小元素列表的语法糖
- 是否可以为通用元素列表创建排序