屠龙之术--基于C语言的正则表达式应用
朱泙漫学屠龙于支离益,单千金之家,三年技成而无所用其巧。
--《庄子·列御寇》
屠龙之术是一个汉语成语,读音tú lóng zhī shù,意思是指极为高明的技术或本领,但是在现实中用不到。
regcomp函数:
功能描述: 把指定的正则表达式编译成一种特定的数据格式。
函数原型: int regcomp(regex_t *preg, const char *regex, int cflags);
参数说明:
regex_t 结构体数据类型,用来存放编译后的正则表达式,它的成员re_nsub 用来存储正则表达式中的子正则表达式的个数,子正则表达式就是用圆括号包起来的部分表达式。
regex: 是指向我们写好的正则表达式的指针。
cflags: 有如下4个值或者是它们或运算(|)后的值:
REG_EXTENDED 以功能更加强大的扩展正则表达式的方式进行匹配。
REG_ICASE 匹配字母时忽略大小写。
REG_NOSUB 不用存储匹配后的结果,只返回是否成功匹配。如果设置该标志位,那么在regexec(在下边介绍)将忽略nmatch和pmatch两个参数。
REG_NEWLINE 识别换行符,这样'$'就可以从行尾开始匹配,'^'就可以从行的开头开始匹配。
C语言中使用正则表达式一般分为三步:
编译正则表达式 regcomp()
匹配正则表达式 regexec()
释放正则表达式 regfree()
例程:
#include <stdio.h>
#include <string.h>
#include <regex.h>
int main(int argc, char** argv)
{
int x;
int ret;
int lno = 0; // 行号
int cflags = 0; // 参数
char *p;
char ebuf[128]; // 错误信息
char lbuf[256]; // 行缓冲区
regex_t reg; // 正则表达结构体
regmatch_t pm[10]; // 匹配列表
const size_t nmatch = 10;
// 编译正则表达式
p = argv[1];
ret = regcomp(®, p, cflags);
if (ret != 0)
{
regerror(ret, ®, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: pattern '%s' \n", ebuf, p);
return 1;
}
// 逐行处理输入的数据
while(fgets(lbuf, sizeof(lbuf), stdin))
{
++lno;
// 用正则表达式进行匹配
ret = regexec(®, lbuf, nmatch, pm, 0);
if (ret == REG_NOMATCH)
{
continue;
}
else if (ret != REG_NOERROR)
{
regerror(ret, ®, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);
return 2;
}
// 打印匹配行(不需要换行)
printf("%04d: %s", lno, lbuf);
}
// 重新编译正则表达式前,必须清空之前的编译结果
regfree(®);
return 0;
}
测试命令:
./regs "^[\t\ ]*r" < regs.c
0014: regex_t reg; // 正则表达结构体
0015: regmatch_t pm[10]; // 匹配列表
0020: ret = regcomp(®, p, cflags);
0023: regerror(ret, ®, ebuf, sizeof(ebuf));
0025: return 1;
0033: ret = regexec(®, lbuf, nmatch, pm, 0);
0040: regerror(ret, ®, ebuf, sizeof(ebuf));
0042: return 2;
0049: regfree(®);
0050: return 0;
0071: return stbuf;
https://www.cnblogs.com/liudw-0215/p/9724347.html