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信息
int update_progress(char *srcStr) {
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;
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