PCRE - Perl-compatible regular expressions
发布时间:2020-12-15 21:07:30 所属栏目:大数据 来源:网络整理
导读:lighttpd的源码中,keyvalue这个数据结构用到了pcre库。之前没见过, google之后发现是一个正则表达式的库,顺便简单了解了一下使用方法。 关于PCRE库的介绍和使用方法可以看手册PCRE(3),PCRE的源码里 附带了一个pcredemo.c,里面注释很详细了,看完应该就
|
lighttpd的源码中,keyvalue这个数据结构用到了pcre库。之前没见过, google之后发现是一个正则表达式的库,顺便简单了解了一下使用方法。 关于PCRE库的介绍和使用方法可以看手册PCRE(3),PCRE的源码里 附带了一个pcredemo.c,里面注释很详细了,看完应该就会用了。 其实最简单的使用只需要知道两个函数(man pcreapi): pcre *pcre_compile(const char *pattern,int options,const char **errptr,int *erroffset,const unsigned char *tableptr);
int pcre_exec(const pcre *code,const pcre_extra *extra,const char *subject,int length,int startoffset,int *ovector,int ovecsize);
pcre_extra *pcre_study(const pcre *code,const char **errptr);
void (*pcre_free)(void *);
其中pcre_free()是在PCRE 8.20之前用来释放pcre_study()返回的pcre_extra的, 在PCRE 8.20 Release中增加了下面这个函数,建议新版本的程序使用: void pcre_free_study(pcre_extra *extra); 关于上述函数中各个参数以及返回值的说明请参考手册,简单使用的话, 大部分参数都是用缺省值就可以了。 下面我用PCRE库实现了一个非常简单的pcre_ls,可以打印当前目录下匹配某个 正则表达式的所有文件: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <pcre.h>
/**
* List all the files that match the 'regex' in current directory
*
* Compile command:
* gcc -o pcre_ls pcre_ls.c -lpcre
*/
#define OVECCOUNT 30 /* should be a multiple of 3 */
int main(int argc,char *argv[])
{
DIR *dp;
struct dirent *dirp;
pcre *re;
const char *error;
int erroffset;
int ovector[OVECCOUNT];
int rc;
if (argc != 2) {
fprintf(stderr,"usage: %s 'regex'n",argv[0]);
exit(EXIT_FAILURE);
}
/* compile the regex in the first argument */
re = pcre_compile(argv[1],&error,&erroffset,NULL);
if (re == NULL) {
fprintf(stderr,"PCRE compilation failed at offset %d: %sn",erroffset,error);
exit(EXIT_FAILURE);
}
/* open current directory */
if ((dp = opendir("./")) == NULL) {
perror("opendir");
exit(EXIT_FAILURE);
}
while ((dirp = readdir(dp)) != NULL) {
rc = pcre_exec(re,NULL,dirp->d_name,(int)strlen(dirp->d_name),ovector,OVECCOUNT);
if (rc > 0)
printf("%sn",dirp->d_name);
}
closedir(dp);
return 0;
} 由于对Perl的语法不熟悉,而且lighttpd的源码中对PCRE的使用也比较简单,所以这里就简单介绍到这里吧。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
