【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
- 【C语言】正则表达式学习笔记
- Perl语言学习笔记 7 正则表达式
- C#Regex正则表达式学习笔记
- C语言正则表达式
- C语言正则表达式
- C语言正则表达式
- 正则表达式 - C语言
- C语言正则表达式
- C语言正则表达式
- C语言表达式 ——学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 正则表达式学习笔记
- 矩阵相乘入门,两个矩阵相乘
- ffmpeg 新老接口问题及对照集锦
- 2012年世界500强排行榜(企业名单)
- 打印出菱形
- CodeForces Round #180 (297B) - Fish Weight
- 【C语言】正则表达式学习笔记
- 安装最新版本的CMake
- 黑马韩前成Linux从入门到精通のLinux基本网络配置の原理篇
- Point-Counterpoint:SDN跟数据中心网络架构都将双双失败?
- [学习笔记5]SSL、CMD命令、PDB、000后缀文件
- 面试100题系列之12判断序列是不是查找二叉树的后序编列
- PDF网页显示: object标签使用pdf插件打开中文文件的问题 (WEB开发)
- Handler的介绍
- [iOS代码] iOS怎么平铺图片