Linux下C正则表达式使用方法

本文以项目实例说明一下posix C正则表达式的使用方法。

项目中有一个网络管理模块,需要访问到Linux系统中可用的网卡,经过在网上搜罗,找到一种获取网络配置信息的方式,即调用getifaddrs();在返回的结果中进行遍历和解析,找到所有以eth开头的行,然后提取出对应的网卡名称。因为网卡名称一般是eth后跟一个整数,为简单而准确的提取出网卡名称,使用正则表达式进行匹配之行之有效的解决之道。

为此需要构建正则表达式,最初根据项目的开发环境直接使用了qt提供的正则表达式类,很方便的实现这一功能。但是后来为了把该模块独立出来,且不依赖与qt,所以就只好重新选择实现这一功能的方法了。纯C或C++是不支持正则表达式的,需要引入第三方库,像boost,posix C正则库以及其他的正则库。

因为在Linux下编程,正好posix也提供了C正则库, 于是就使用该库,使用过程如下代码:

bool regexMatch(const char *regExpr, const char *str)
{
    //TO DO
    const int ERR_BUF_LENT = 128;
    const int N_MATCHES = 10;
    regex_t reg;
    char errMsgBuf[ERR_BUF_LENT];
    regmatch_t pMatch[N_MATCHES];
    int errNo;

    //编译正则表达式
    errNo = regcomp(&reg, regExpr, REG_EXTENDED | REG_ICASE);
    if(!errNo)
    {
        errNo = regexec(&reg, str, sizeof(pMatch) / sizeof(regmatch_t), pMatch,0);
    }

    //释放编译过的正则表达式所使用的资源
    regfree(&reg);
    if(!errNo)
    {
        return true;
    }
    else
    {
        regerror(errNo, &reg, errMsgBuf, sizeof(errMsgBuf));
        std::cout << __FUNCTION__ << errMsgBuf << std::endl;
        printf("%s\n", errMsgBuf);
        return false;
    }
}

 

 

大致分为以下四步

第一步,编译正则表达式。通过调用regcomp完成,参数分别是存放编译后的正则表达式的结构指针, 正则表达式源字符串,以及编译正则表达式参数;

第二步,匹配字符串。调用regexec,这个函数的参数比较多一些,分别是,编译后的正则表达式指针,被匹配字符串,存储匹配结果的数组大小,以及存储匹配结果的数组,和匹配规则参数;

第三步,引用匹配结果,通过遍历存储匹配结果的数组可得;

第四步,释放编译后的正则表达式,通过调用regfree,其参数即是编译后的正则表达式指针。

 

如果,在执行编译,比较的过程中,出现了错误,可以调用regerror来获取错误原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值