linux学习笔记6--正则表达式的应用

本文介绍如何使用正则表达式函数族(REGEX)在C程序中进行数据匹配与抽取,详细解析了正则标记的生成、数据源的匹配过程及正则标记的释放等步骤,并通过一个具体的例子展示了如何从HTML文件中抽取URL和标题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用REGEX函数族,在程序内部使用,匹配抽取数据

类型:regex_t

函数
(1)生成正则标记(通过正则语句字符串生成)
int regcomp(regex_t *preg, const char *regex, int cflags);

(2) 通过正则标记匹配数据源,通过子表达式传出数据位置,便于抽取关键信息,一次返回一条匹配项,需要循环匹配
返回若干个子表达式的位置,存到regmatch_t pmatch[]数组中
通过传出的位置信息,偏移抽取指定数据
int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags);

(3)释放正则标记
void regfree(regex_t *preg);

(4)正则错误处理
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

#include<sys/types.h>
#include<regex.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/mman.h>

int regex_fun(const char* src, const char* regtext)
{
	regex_t reg;
	regmatch_t pmatch[3];
	regcomp(&reg,regtext,0);
	char url[4096];
	char title[1024];
	bzero(url,sizeof(url));
	bzero(title,sizeof(title));
	while((regexec(&reg, src,3, pmatch,0)) == 0)
	{
		snprintf(url,pmatch[1].rm_eo - pmatch[1].rm_so+1,"%s",src+pmatch[1].rm_so);
		snprintf(title,pmatch[2].rm_eo - pmatch[2].rm_so+1,"%s",src+pmatch[2].rm_so);
		printf("[%s] [%s]\n",url,title);
		bzero(url,sizeof(url));
		bzero(title,sizeof(title));
		src += pmatch[0].rm_eo;
	}

	regfree(&reg);
	return 0;
}


int main()
{
	char* regtext = "<a[^>]\\+\\?href=\"\\([^\"]\\+\\?\\.shtml\\)\"[^>]\\+\\?>\\([^<]\\+\\?\\)</a>";
	int fd;
	fd = open("./world.html",O_RDWR);
	int size = lseek(fd,0,SEEK_END);
	char *p = mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
	close(fd);
	regex_fun(p,regtext);
	munmap(p,size);
	return 0;
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值