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

来源:互联网 发布:网络装修公司 编辑:程序博客网 时间:2024/05/20 22:39

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