【C语言】正则表达式学习笔记

正则表达式: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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值