REGEX.C GNU 提取过滤数据
今天被@SVCHAO 勾起兴趣来了。。 有把正则表达式兴趣捡起来了,试了下notepad++基本上语法倒是没有忘记,不过如果是用在嵌入式的方案的话,似乎还是有点费劲的。
先mark一个基础语法。
单个字符匹配
采用方括号描述,例如[0135678]表示0 1 3 5 6 7 8 都可以通过该次匹配
采用方括号排除,例如[^azAZ]表示除了a z A 和Z 全部可以通过该字节匹配
允许使用-表示范围,例如[0-9a-zA-Z]表示所有数字跟字母
常用单个字符存在通用表达方式,例如\w 表示[0-9a-zA-Z] 剩下的慢慢补充
采用{}表示匹配次数描述,例如\w{2}表示连续两个字符都是数字或者字母
采用()捕获比较结果…
以上内容自行科普。
为了适应使用场景为嵌入式 找到了这个demo
slre(Github Super Light Regular Expression library)
但是我好像不支持{},而且没找到贪婪相关的… 所以暂时搁置
后来说熟悉一下GNU里面的regex.h
发现跟python的regex接口很像 应该是posix的原因。
坑爹的虚拟机 很久没更新了,折腾了一会环境之后总算是测试出效果了。
#include <stdio.h>
#include <sys/types.h>
#include <regex.h> int main(int char_c,char** char_v)
{
char* p_str = " Url = www.google.com.hk ;";
char* p_reg = " {0,}(\\S+) {0,}= {0,}(\\S+) {0,};"; regex_t reg;
regmatch_t matchs[20];
memset(matchs,0,sizeof(matchs));
int r; r = regcomp(®, p_reg, REG_EXTENDED); r = regexec(®, p_str, 20, matchs, 0);
return 0;
}
因为是自己测试用的代码,所以并没有特地去做输出、直接断点打下来看就知道结果了,
其中REG_EXTENDED一定要加,不然某些特性用不了,
还有一个奇怪的点就是,matchs[0]中会存放一个整个p_reg的匹配范围,所以如果是只需要提取我们定义中()的目标结果的话、
从p_reg[1]开始就好了。
顺手吐槽下C的字符串语法、调了好久… 结果是\跟\\的锅… 不过似乎也没什么更高效的方案。
下一步如果再用到的话,可能就是手动往SLRE里面添加贪婪的部分、或者找到GNU的regex.c进行裁剪了…
到时候再说
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
#include <string.h> int main(int char_c, char** char_v) {
char* p_str = " Url = www.google.com.hk ;";
char* p_reg = " {0,}(\\S+) {0,}= {0,}(\\S+) {0,};"; regex_t reg;
regmatch_t matchs[20];
int r, i; r = regcomp(®, p_reg, REG_EXTENDED);
if (r != 0) {
printf("err");
} r = regexec(®, p_str, 20, matchs, 0);
if (r != 0) {
printf("err");
} for (i = 0; i < 20; i++) {
int start_index = matchs[i].rm_so;
int end_index = matchs[i].rm_eo;
int len = end_index - start_index; if (start_index >= 0) {
char dis_buffer[256];
strncpy(dis_buffer, &p_str[start_index], len);
dis_buffer[len]='\0';
printf("catch:%s\n",dis_buffer);
}
} return 0;
}
鉴于我抓输出抓了很久… 我决定还是把数据捕获的代码贴出来…
使用环境为G++ with eclipse-cdt
debug用习惯了就没换IDE
catch: Url = www.google.com.hk ;
catch:Url
catch:www.google.com.hk
测试输出结果是正确的…
REGEX.C GNU 提取过滤数据的更多相关文章
- 测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇
测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇 在前面我分享了几个新浪微博的自动化脚本的实现,下面我们继续实现新的需求,功能需求如下: 1,登陆微博 2,抓取评论页内容3,用正则表 ...
- python操作MONGODB数据库,提取部分数据再存储
目标:从一个数据库中提取几个集合中的部分数据,组合起来一共一万条.几个集合,不足一千条数据的集合就全部提取,够一千条的就用一万减去不足一千的,再除以大于一千的集合个数,得到的值即为所需提取文档的个数. ...
- [PY3]——过滤数据——列表推导、filter()、itertools.compress()
问题 你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 解决方案 最简单的过滤数据的方法,就是使用列表推导. 使用列表推导的一个潜在缺陷就是如果输入非常大的时候会产生一个非常大的结果集 ...
- 5.MySQL必知必会之过滤数据-WHERE
本章将讲授如何使用SELECT语句的WHERE子句指定搜索条件. 1.使用WHERE子句 数据库表一般包含大量的数据,很少需要检索表中所有行.通常只 会根据特定操作或报告的需要提取表数据的子集.只检索 ...
- asp.net过滤数据中有异常数据字符串
/// <summary> /// 过滤数据 /// </summary> /// <param name="_str"></param& ...
- 转:SQL SERVER数据库中实现快速的数据提取和数据分页
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- 用php自带的filter函数验证、过滤数据 -转载
PHP过滤器包含两种类型 Validation:用来验证验证项是否合法 Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等. input_filters ...
- ADO.NET 快速入门(十):过滤数据
我们有很多方法来过滤数据.一种是在数据库命令级别,利用 where 子句查询过滤数据.另一种是在数据填充到 DataSet 以后过滤数据.本篇讨论后者. 一旦数据填充到 DataSet,你可以使用 ...
- Android利用Filter过滤数据
MainActivity如下: package cc.testfilterable; import java.util.ArrayList; import java.util.HashMap; imp ...
随机推荐
- SharePoint Site "Language Settings"功能与CSOM的对应
博客地址:http://blog.csdn.net/FoxDave SharePoint网站中的语言设置:"Language Settings",可以用CSOM通过Site的一些 ...
- X3850M2安装CertOS 7 KVM 2--VNC
需要安装远程桌面,否则无鼠标的日子比较难. VNC的安装需要步骤较多,重点参考以下文章: http://www.itzgeek.com/how-tos/linux/centos-how-tos/con ...
- asp.net mvc api auth
一.登录 /// <summary> /// 获取令牌 /// </summary> /// <param name="userName">用户 ...
- C++引用的作用和用法
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符&引用名=目标变量名: 例如: int q; int &ra=a; 说明: &am ...
- Javascript轮播 支持平滑和渐隐两种效果(可以只有两张图)
先上两种轮播效果:渐隐和移动 效果一:渐隐 1 2 3 4 效果二:移动 1 2 3 4 接下来,我们来大致说下整个轮播的思路: 一.先来看简单的,移动的,先上来一个图----移动效果图: 说明: ...
- iOS一些常用的小知识点
//获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量 [[UIApplication sharedApplication] delegate]; //获得程序的主Bundle N ...
- C/C++读入一行不定个数的整数
我想,每个人一开始遇到这个问题,都会觉得挺简单的.但真正实施的时候,可能就会觉得还是有点坑的.毕竟对于C/C++这样成熟而使用广泛的语言而言,对于这个简单的问题竟然没有一个简洁有力甚至一行代码的解决方 ...
- Java的CLASSPATH,趁还没忘赶紧写点
咳咳,睡眠不足加上年龄增长,真的赶脚记忆力不行啦. 接触Java以来,对于环境配置就是按照网上的教程,一路复制粘贴,也没啥想法; 最近决定啃啃ThinkInJava,没看两章就看到这CLASSPATH ...
- CDH5X 安装oozie报错To enable Oozie web console install the Ext JS library.
最近在CDH5.X 安装oozie 服务,服务安装完毕,访问oozie server ui,报如下错误: 页面提示: Oozie web console is disabled.To enable O ...
- softwareTesting_work1
1.12306手机APP软件测评 首先是软件界面,iPhone版本和android版本长得是一模一样,虽然是注重功能的软件,但是一样样的界面让人完全感受不到软件设计者的诚意啊. 还有就是软件图片和图标 ...