zoukankan      html  css  js  c++  java
  • 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(&reg, p_reg, REG_EXTENDED);
    
        r = regexec(&reg, 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(&reg, p_reg, REG_EXTENDED);
        if (r != 0) {
            printf("err");
        }
    
        r = regexec(&reg, 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]='';
                printf("catch:%s
    ",dis_buffer);
            }
        }
    
        return 0;
    }

    鉴于我抓输出抓了很久… 我决定还是把数据捕获的代码贴出来…

    使用环境为G++ with eclipse-cdt

    debug用习惯了就没换IDE

    catch:  Url        =  www.google.com.hk ;
    catch:Url
    catch:www.google.com.hk

    测试输出结果是正确的…

  • 相关阅读:
    JAVA_SE基础——47.接口
    抽象类和接口的区别[精华版]
    JAVA_SE基础——46.引用数据类型变量.值交换[独家深入解析]
    JAVA_SE基础——45.基本类型变量.值交换[独家深入解析]
    第一个Spring程序
    三层架构和MVC的区别
    Spring 概述及IOC理论推导
    Mybatis之缓存
    Mybatis之动态SQL
    Mybatis之一对多和多对一处理
  • 原文地址:https://www.cnblogs.com/jasonbu/p/4919212.html
Copyright © 2011-2022 走看看