项目中需要解析一段sql 语句,然后各种百度,看了一些文章,然后就头晕了,根本不知道他们在讲啥,感觉好像非常深奥的一样。感觉他们讲的太专业了,不能通俗易懂。所以把自己学习的记录下来,以便后面查看
1) 要解析一个字符串,首先你得要有一些规则吧,比如说字符串按照逗号分割,取出字符串中的特定字符串,或者把字符串中的整数取出来,这些我们都称为规则。在boost 库中有一个专门对应的模版类。翻译成中文名字也是"规则"
boost::spirit::rule<>.
2)有了规则就可以开始解析了,解析之后肯定会有结果。比如说一个字符串,字符串是以逗号隔开的,我要把所有的以逗号隔开的字符串保存在一个数组里面。或者说一个字符串里面有一个整数,我要把这个整数取出来保存在一个变量里面。
"123,123,456,789" 这个字符串是以逗号隔开的,解析之后就可以把这些保存在一个数组中。
boost::spirit::parse 这个函数用来解析
这个举个列子入门一下。有一个字符串"0.124dsfsdf", 我想看看这个字符串中是否有一个浮点数。根据前面的介绍,首先需要创建一个规则。那规则怎么创建了。boost 给我们内置了非常多的规则,这些规则可以直接拿来用。这个列子里面就用到浮点数的内置类型,关于更多的内置类型可以看文档。
boost::spirit::real_p
有了这个浮点数的内置类型之后就可以开始解析了,调用parse 函数,完整代码如下
#include <boost/spirit.hpp>
#include <boost/spirit/include/classic.hpp>
int main(int argc, char* argv[])
{
boost::spirit::rule<> testrule1 = boost::spirit::real_p;
boost::spirit::parse_info<> info = boost::spirit::parse(("0.124dsfsdf"), testrule1);
if (info.hit)
{
//说明匹配到了,字符串中包含一个浮点数
}
if (info.full)
{
//说明整个字符串都匹配完了。否则就说明在这个字符串的某个位置停止匹配了,因为没有合适的规则
}
if (NULL != info.stop)
{
printf(info.stop);//匹配没有完全的话,打印出是在哪个位置中断了。这个是字符串指针类型
}
printf("%d", info.length);//一共匹配了多少个字符串
return 0;
}
上面代码只是判断一个字符串是否符合你的规则,也就是是否包含一个浮点数。有可能我们需要稍微改进一下,我们想把这个浮点数拿出来。boost 库对这个当然有支持的。需要需改的地方也就是规则,我们把规则修改一下。告诉boost 当匹配到之后,把这个数据给我。
float value = 0.0f; //用来保存匹配到的值
boost::spirit::rule<> testrule1 = boost::spirit::real_p[boost::spirit::assign_a(value)];
这个规则里面多一个boost::spirit::assign_a(value), 这个东西就是boost 内置的一个东西,其实他是一个函数或者函数对象,可以认为相当于一个回调函数,当匹配到一个浮点数的时候,boost 调用这个回调函数,把匹配到的值当作参数传入。boost::spirit::assign_a 这个函数是boost 内置的一个函数,其实就是一个赋值函数而已。当然你也可以传入一个自己的回调函数。boost 还有非常多的这种类似的函数。比如 boost::spirit::push_back_a 就是把匹配到的值放到一个std::vector 或者std::list 中。
上面的这个列子太简单,简单的入门
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/inforecovvery/article/details/47831415