使用Boost Spirit提取无限制的字符串和整数

时间:2014-01-31 00:53:48

标签: c++ parsing boost boost-spirit peg

我正在尝试使用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 ]

1 个答案:

答案 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_)