我正在尝试使用Boost Spirit将"ABC10DEF20"
之类的字符串转换为数组["ABC", 10, "DEF", 20]
。我不确定“无限制”是否是正确的术语,但我想通过整数和非整数的边界来分解它,而不是用空格或其他分隔符分割它。
我想出的代码如下:
std::string search_str = "ABC10DEF20";
std::vector<boost::variant<std::string, unsigned int> > v;
std::string::const_iterator iter = search_str.begin();
std::string::const_iterator last = search_str.end();
bool r = parse(iter, last,
+(+(char_ - digit)|uint_),
v);
对于输入"ABC10DEF20"
,这会导致[ 65, 66, 67, 10, 68, 69, 70, 20 ]
(没有字符串,只是以整数存储的字符串部分的整数和ASCII组件)。对于输入"10"
,我按预期获得[ 10 ]
。
答案 0 :(得分:2)
从输出中可以看出,你匹配的是单个字符,而不是字符串和完整的无符号整数。
不确定它会解决它,但请尝试:
bool r = parse(iter, last,
+(+(+char_ - digit)|uint_),
v);
(请注意+
之前添加的char_
。)
v
的类型可能需要更改为:
std::vector<boost::variant<std::vector<char>, unsigned int> > v;
,您可能需要修复结果。对Boost Spirit并不十分熟悉;我敢打赌,这是一种更好,更清洁的方式。
最终解决方案:
修改要使用的解析表达式:
+(as_string[+(char_ - digit)]|uint_)