C语言中使用正则表达式

POSIX 规定了正则表达式的C语言库函数, 参见regex(3), 我们已经学了很多C函数得用法  读者应该具备自己看懂man手册得能力

C语言中使用正则表达式一般分为三部:

1.编译正则表达式regcomp()

2.匹配正则表达式 regexec()

3.释放正则表达式 regfree()

先来通过一个demo展示一下这三个函数的用法

#include <cstdio>
#include <sys/types.h>
#include <regex.h>

int main(int argc, char* argv[])
{
    if (argc != 3) {
        printf("Usage: %s RegexString AND Text\n", argv[0]);
        return 1;
    }

    const char* p_regex_str = argv[1];
    const char* p_txt = argv[2];
    regex_t oregex;   // 编译后的结构体

    int ret = 0;
    char emsg[1024] = { 0 };   // 保存错误信息的数组
    size_t emsg_len = 0;

    if ((ret = regcomp(&oregex, p_regex_str, REG_EXTENDED | REG_NOSUB)) == 0) {// 编译
        //成功编译
        if ((ret = regexec(&oregex, p_txt, 0, NULL, 0)) == 0) {// 执行匹配不保存匹配的返回值
            printf("%s matches %s \n", p_txt, p_regex_str);
            regfree(&oregex);
            return 0;
        }
    }

    emsg_len = regerror(ret, &oregex, emsg, sizeof(emsg)); // 如果出错得到错误信息
    emsg_len = emsg_len < sizeof(emsg) ? emsg_len : sizeof(emsg) - 1;
    emsg[emsg_len] = '\0';
    printf("Regex error Msg : %s \n", emsg);
    regfree(&oregex);
    return 1;
}

效果:

 

下边是对这三个函数得详细解释

一.  regcomp()这个函数把指定的正则表达式pattern编译成一种 特定的数据格式compiled, 这样使匹配更加有效

函数regexec()会使用这个数据在目标文件中匹配,执行成功返回0。

int regcomp(regex_t * compiled, const char* pattern, int cflags)

regex_t :是一个结构体类型,用来存储编译后的正则表达式,它的成员re_nsub用来存储正则表达式中的子正则表达式的个数

子正则表达式就是用括号括起来的那部分(在上一篇 我已经给大家事例过了)

pattern:   指向我们写好的正则表达式字符串的首地址

cflags: 这个参数有四个值:可以把他们用 “ | ” 连接起来

          1.REG_EXTENDED   :以功能更加强大的扩展正则进行匹配

          2.REG_ICASE : 匹配字母是忽略大小写

          3.REG_NOSUB: 不用存储匹配后的结果,只要返回是否成功匹配。如果设置该标记,那么 regexec()将忽略nmatch和

pmatch两个参数

          4.REG_NEWLINE: 识别换行符  这样  “^”就可以从行的开头进行匹配  "$"就可以从行的结尾开始匹配

 

更多的C/C++ linux编程我会在下面的文章中陆续的分享,也可以关注‘奇牛学院’

来一起讨论

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值