如何使用BOOST方法解析字符串中的数字?

时间:2011-06-22 08:06:04

标签: parsing boost

问题:Visual C ++ 10项目(使用MFC和Boost库)。在我的一个方法中,我正在阅读简单的 test.txt 文件。

以下是文件内部(std::string):

12 asdf789, 54,19 1000 nsfewer:22!13

然后我需要仅使用 boost 方法将所有数字转换为 int 。例如,我有一个我必须解析的不同字符列表:

( ’ ' )
( [ ], ( ), { }, ⟨ ⟩ )
( : )
( , )
( ! )
( . )
( - )
( ? )
( ‘ ’, “ ”, « » )
( ; )
( / )

在谈话之后,我必须有一些大量的int值,比如这个:

12,789,54,19,1000,22,13

也许有人已经完成了这份工作?

PS。我很擅长提升。

谢谢!


更新


这是我的样本:

std::vector<int> v;

rule<> r = int_p[append(v)] >> *(',' >> int_p[append(v)]);

parse(data.c_str(), r, space_p);

我所要做的就是在我的代码中添加其他转义字符(,'[](){}:! ...),但是没有找到怎么做!

2 个答案:

答案 0 :(得分:0)

  • 简单的出路是正则表达式。
  • 艰难的出路是使用精神
  • 中间路线使用algorithm :: string :: split,使用正确的分隔符,然后使用lexical_cast&lt;&gt;()循环遍历所有单个部分。这样你就可以过滤出整数。

但同样,正则表达式将更加强大,而且比各种原始字符串操作黑客程序更清晰。

答案 1 :(得分:0)

除了正则表达式,boost :: spirit和手动解析文本之外,您还可以将AX解析器生成器与VC ++ 2010一起使用.AX规则看起来像这样(未经测试):

std::vector<unsigned> v;
auto text_rule = *(*(axe::r_any() - axe::r_numstr()) & ~axe::r_numstr() 
   >> axe::e_push_back(v)) & axe::r_end();
// test it
std::string str("12 asdf789, 54,19 1000 nsfewer:22!13");
text_rule(str.begin(), str.end());
// print result
std::for_each(v.begin(), v.end(), [](unsigned i) { std::cout << i << '\n'; });

基本的想法是跳过与数字字符串规则(r_numstr)不匹配的所有输入字符。