2014-01-31 34 views
1

我试图使用Boost Spirit将"ABC10DEF20"这样的字符串转换为数组["ABC", 10, "DEF", 20]。我不确定“unde undefined”是否是正确的术语,但是我想将它分解为整数和非整数的边界,而不是用空格或另一个分隔字符来分割它。使用Boost Spirit提取无限的字符串和整数

我已经想出了类似的代码:

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 ]

回答

2

从输出中,很明显你是匹配单个字符,而不是字符串和完整的无符号整数。

不知道它会解决它,但尝试:(注意char_前加+

bool r = parse(iter, last, 
       +(+(+char_ - digit)|uint_), 
       v); 

类型的v可能需要更改为: std::vector<boost::variant<std::vector<char>, unsigned int> > v;,和你可能不得不修复结果。不太熟悉Boost Spirit;我敢打赌,有一种更好,更清洁的方式。

最终解决方案:

修改解析表达式中使用:

+(as_string[+(char_ - digit)]|uint_) 
+0

制作规则变化导致'[65,66,67,49,48,68,69,70, 50,48]'所以它实际上更糟糕,因为现在即使整数都以ASCII字符形式出现。 – eco

+0

另外,+ char_应该转换为std :: string就好了。 Boost Spirit文档多次执行此操作。 – eco

+0

如果您优先考虑'数字'会怎么样?即'数字 - + char_'? –

相关问题