boost spirit 解析字符串 (一)

项目中需要解析一段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 中。

上面的这个列子太简单,简单的入门

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 22:53:51

boost spirit 解析字符串 (一)的相关文章

Boost property_tree解析json

使用Boost property_tree解析json 之前使用jsoncpp解析json,现在才知道boost就有解析的库,学习一下吧 property_tree可以解析xml,json,ini,info等格式的数据,用property_tree解析这几种格式使用方法很相似. 解析json很简单,命名空间为boost::property_tree,reson_json函数将文件流.字符串解析到ptree,write_json将ptree输出为字符串或文件流.其余的都是对ptree的操作. 解析

boost spirit 语法解析

使用spirit能很方便的解析自定义的语法规则,在他的文档中也说明了spirit与regex还有其他库的不同点.灵活,伸缩性好,可以用来搭建小的语法解析器也可以用来开发大型编译器等等. 定义语法规则之前首先要了解一下Extended Backus-Normal Form (EBNF) EBNF可以定义一下生成合法字符串的公式,例如: 例1: rule1 = "0" | "1" | "2" | "3". rule2 = &quo

使用BOOST.SPIRIT.X3的RULE和ACTION进行复杂的语法制导过程

Preface 上一篇简述了boost.spirit.x3的基本使用方法.在四个简单的示例中,展示了如何使用x3组织构造一个语法产生式,与源码串匹配并生成一个综合属性.这些简单的示例中通过组合x3库中的基本语法单元,创建了一些复杂语法单元,也就是非终结符.但这些示例中的语法单元完成的事情还不够,它们只能配合phrase_parse函数告诉我们,与源码是否匹配:并且通过一个简单赋值操作返回一个综合属性.如果我想要在匹配成功的时候完成一些用户自定义的Action,如何完成这种需求?此外,仅使用基本语

(三)Boost库之字符串处理

(三)Boost库之字符串处理 字符串处理一直是c/c++的弱项,string_algo库很好的弥补了这一点. string_algo 库算法命名规则: 前缀i    : 有这个前缀表名算法的大小写不敏感,否则大小写敏感 后缀_copy:  有这个后缀表明算法不变动输入,返回处理结果的拷贝,否则算法原地处理 后缀_if  :  有这个后缀表明算法需要一个作为判断式的谓词函数对象,否则使用默认的判断准则 string_algo库提供的算法共分五大类,如下: [1]大小写转换: [2]判断式与分类:

Javascript 解析字符串生成 XML DOM 对象。

Javascript 接收字符串生成 XML DOM 对象.实测对 Firefox .IE6 有效.可用于解析 ajax 的服务器响应结果,也可用于解析自定义字符串.?1. [代码]函数   ppt模版  /** * Parses DOM from XML text.<br /> *  * @author Typhoon.Free.Wolf * @version 2014-02-28_15-51 * @param blDebugFlag *      - Debug flag: true, f

关于解析字符串

nodejs中提供的解析字符串模块:首先需要映入url模块和查询字符串模块 其中url提供的字符串解析方法为parse const url = require('url'); const querystring = require('querystring'); 'use strict'; const http = require('http'); const url = require('url'); const querystring = require('querystring'); co

(二)boost库之字符串格式化

(二)boost库之字符串格式化 程序中经常需要用到字符串格式化,就个人而言还是比较倾向于C格式的输出,如果只是打印日志,printf就够了,如果到生成字符串,获取你可以选择sprintf,但这些都是需要你预先分配空间的,对于一些不可预知长度的字符串格式化,就比较鸡肋了,不过还是可以实现的,如: void XString::format(const char *strFmt, ...) { va_list vl; va_start(vl, strFmt); int count = _vscpri

java解析字符串拆分单独元素

有时候,需求要求传递多个字符串参数,但是方法参数已经固定为单个String,笔者在学习unity和android之间的消息传递时就遇到这个问题,所以就写了这么一个解析字符串拆分单独元素的方法. 示例:“@[email protected]@apple” 解析为: my red apple 1 package cutstring; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Scanner;

sql 解析字符串添加到临时表中 sql存储过程in 参数输入

sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneColumnTabel('001,gf', ',') select * from 表 where ID in (select id from 临时表) Create function [dbo].[Func_SplitOneColumnTabel] (@str nvarchar(max),@split v