使用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(®,regtext,0);
char url[4096];
char title[1024];
bzero(url,sizeof(url));
bzero(title,sizeof(title));
while((regexec(®, 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(®);
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;
}
结果