Android C语言中的正则表达式

C语言中的正则表达式

3个步骤:
1.编译,regcomp()
2.匹配,regexec()
3.释放,regfree()

1.int regcomp(	regex_t *compiled,
		const char *pattern,
		int cflags)
	把正则表达式pattern编译成一种特定的数据格式compiled,这样做可以使匹配更有效。
	(1)regex_t是一个结构体,用来存放编译后的正则表达式。其中re_nsub用来存放子正则表达式的个数,子正则表达式就是用括号括起来的部分。
	(2)pattern是前面写好的正则表达式
	(3)cflags有小面的4个值或运算(|)组合成得到
		REG_EXTENDED 以功能更加强大的扩展正则表式的方式进行匹配。
		REG_ICASE 匹配字母时忽略大小写。
		REG_NOSUB 不用存储匹配后的结果。
		REG_NEWLINE 识别换行符,这样'$'就可以从行尾开始匹配,'^'就可以从行的开头开始匹配。

2.int regexec(regex_t *compiled,
		char *string,
		size_t nmatch,
		regmatch_t matchptr[],
		int eflags)
	执行成功后返回0。其中regmatch是一个结构体,rm_so存放匹配文本串在目标 串中的开始位置,
	(1)compiled是已经编译好的正则表达式
	(2)string是目标文本
	(3)nmatch是regmatch_t结构体数组的长度
	(4)matchptr是regmatch_t类型的结构体数组,存放匹配文本串的位置信息。
	(5)eflags有两个值
		REG_NOTBOL
		REG_NOTEOL

3.void regfree(regex_t *compiled)
	使用完释放。

从字符串中提取dts信息

//通过解析日志获取执行进度并更新到变量progress
int update_progress(char *srcStr) {
//    2020-04-26 17:26:33.089 31378-31447/com.zhangyu.myopengl E/ffmpeg.c: [mov,mp4,m4a,3gp,3g2,mj2 @ 0xce11bc00] stream 1, sample 965, dts 22360816
//    2020-04-26 17:26:33.089 31378-31447/com.zhangyu.myopengl E/ffmpeg.c: result=22
    char *regex = "dts [0-9]*";
    char str[256];
    regex_t comment;
    regmatch_t regmatch[1];
    regcomp(&comment, regex, REG_EXTENDED | REG_NEWLINE);
    int status = regexec(&comment, srcStr, 1, regmatch, 0);
    if (status == 0) {
        memset(str, sizeof(str), 0);
        int start = regmatch[0].rm_so + 4;//因为dst 所以偏移4个字符
        int end = regmatch[0].rm_eo;
        int len = end - start;
        memcpy(str, &srcStr[start], len);
        str[len] = '\0';
    }
    regfree(&comment);
    int result = atoi(str) / 1000000;
    LOGE("result=%d\n", result);
    return result;
}

//    2020-04-26 17:26:33.089 31378-31447/com.zhangyu.myopengl E/ffmpeg.c: [mov,mp4,m4a,3gp,3g2,mj2 @ 0xce11bc00] stream 1, sample 965, dts 22360816
//    2020-04-26 17:26:33.089 31378-31447/com.zhangyu.myopengl E/ffmpeg.c: result=22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值