正则表达式:Regular Expression 是一个字符用来匹配某个符合一定规则的字符串;在处理复杂字符串的时候,正则表达式的优点体现出来了。
正则表达式的语法包括:1、字符类 2、数量限定符 3、位置限定符 4、其他转义字符,如以下正则表达式例子:
例子1:
http:\/\/www\..*\.com (用来匹配网址)
http:\/\/www\.. \.com 为字符类
\/ \.为转义字符,分别代表符号‘\’,‘.’
*数量限定符 紧跟在前面的单词应匹配0次或多次
例子2:
[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+(用来匹配邮件地址)
[a-zA-Z0-9_.-]
、@[a-zA-Z0-9_.-]、\.[a-zA-Z0-9_.-]为字符类,其中[]表示匹配括号中的任何一个字符即可;-表示范围,a-z,表示a到z的所有字符;+为位置限定符 表示前面的单元应该匹配一个或多次
例子3:
^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$
(用来匹配IP地址)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}为字符类,[]含义如上
{1,3}为数量限定符,表示前面的单元最少1次,最多3次
^ $位置限定符,分别表示匹配行首和行末
例子4:
^\w+$(用来匹配只含字母、数字、下划线)
^、$位置限定符,如上
\w转义字符,表示字母数字下划线
C语言中要用到正则表达式,需要用到<rgex.h>这个头文件以及函数regcomp()、regexec()、regerror()、regfree()函数,函数说明如下:
函数名:regcomp 函数原型:int regcomp(regex_t *preg,const char *regex,int cflags) 函数功能:将正则表达式编译成适合regexec()处理的数据形式 参数说明:preg--存储转换后的正则表达式地址 regex--正则表达式地址 cflags--这里取REG_EXTENDED,扩展的正则表达式 返回值:成功返回0,否则写入错误代码 函数名:regexec 函数原型:int regexec(const regex_t *preg,cost char *string,size_t nmatch,regmatch_t pmatch[],int eflags) 参数说明:preg--经regcomp转换后的正则表达式的地址 string--待匹配的字符串地址 nmatch--pmatch的地址空间大小 pmatch--匹配的字符串起始地址 eflags--这里取REG_NOTBOL 特别说明:regmatch_t的数据类型如下: typedef struct{ regoff_t rm_so; regoff_t rm_eo; }regmatch_t; rm_so:表示匹配字符串的起始位置 rm_eo:表示匹配字符串的结束位置 返回值:成功返回0,否则返回REG_NOMATCH 函数名:regerror 函数原型:size_t regerror(int errcode,const regex_t *preg,char *errbuf,size_t errbuf_size) 函数功能:将出错信息存储在errbuf为起始地址的空间 参数说明:errcode--regcomp()、regexec()函数的非0返回值 preg--经regcomp转换后的正则表达式的地址 errbuf--存储出错信息的地址 errorbuf_size--errbuf数组的长度 函数名:regfree 函数原型:void regfree(regex_t *preg) 函数功能:释放空间,防止内存泄漏 参数说明:preg--存储regcomp()转换后的正则表达式地址 返回值:无
利用以上函数编写出如下代码:#include<stdio.h> #include<regex.h> //regcomp()、regexec()、regfree()头文件 #include<stdlib.h> /* *说明: 参考了《linux编程一站式学习》 *函数名: main *功能: 通过命令行参数输入正则表达式、待匹配的字符串,判断是否匹配 *输入: argv[1]--正则表达式 argv[2]--待匹配的字符串 *输出: 匹配输出argv[2] match argv[1],否则输出出错信息 *修改时间: 2013年5月1日 */ int main(int argc,char *argv[]) { /*判断命令行参数个数*/ if(argc!=3) return 1; //非正常退出 regex_t *reg; //regex_t数据类型为结构体 reg=(regex_t *)malloc(sizeof(reg)); //分配内存空间 int flag1=REG_EXTENDED,status=0,flag2=REG_NOTBOL; size_t errorlen=0; char errordata[1024]={0}; /*编译正则表达式,使其适合regexec()处理*/ if((status=regcomp(reg,argv[1],flag1))==0){ /*进行字符串的匹配成功返回0,匹配的字符串位置信息不存储在内存空间*/ if((status=regexec(reg,argv[2],0,NULL,flag2))==0){ printf("%s match %s\n",argv[2],argv[1]); regfree(reg); //释放内存 return 0; //正常退出 } } errorlen=regerror(status,reg,errordata,sizeof(errordata)); //将出错信息存储在errordata为起始地址的内存空间 errordata[errorlen]='\0'; //字符串的结束标记 printf("error message:%s\n",errordata); regfree(reg); return 1; //非正常退出 }
测试如下:
欢迎指出文章存在的BUG,邮箱:zjgsuffddybz@gmail.com