PCRE正则库使用简介—C语言

之前在做正则匹配时一直是使用的posix正则库,但posix正则库虽然简单但却没有PCRE来的强大,posix正则库貌似是不支持非贪婪匹配的,而我要做的程序中却偏偏有用到非贪婪匹配,所以posix便已经不能满足我了。

网上找找关于c语言的正则库,PCRE是一个很强大的正则库,它是perl语言兼容正则表达式,是一种用c语言写的正则库,PCRE也是perl的缺省正则库。

PCRE的使用也比较简单,不过相对于POSIX来说它有更多的函数和更多的参数,这里主要介绍几个常用的函数。

第一个函数
pcre *pcre_compile(const char *pattern, int options,
const char **errptr, int *erroffset,
const unsigned char *tableptr);

用它来编译我们的正则表达式,其中pattern为我们的正则表达式,options为选项,选项比较多,这里不作说明.errptr是当发生错误时错误信息写入的地方,erroffset为出错的位置,tableptr指向一个字符数组的指针,可以设置为空NULL。
除了第二个参数可以设置为0以及最后一个参数可以设置为NULL外,其它参数均不能设置为NULL.

第二个函数
int pcre_exec(const pcre *code, const pcre_extra *extra,
const char *subject, int length, int startoffset,
int options, int *ovector, int ovecsize);

该函数就是执行正则匹配了,code是使用pcre_compile成功返回的值,extra指向一个pcre_extra结构体,可以为NULL。subject为我们要进行匹配的字符串,length为我们要匹配的字符串的长度,startoffset为我们要匹配的字符串的偏移量,如果要从头开始匹配则是0,如果要多次匹配则可以在循环中改变这个值为上一次匹配的结束位置这样来进行多次匹配,因为和posix一样,pcre_exec执行一次只匹配一个结果。options为设置相关参数,这里不作介绍,一般为0即可,ovector为匹配成功后所匹配的子串在字符串中的位置,数组中第一位为第一个匹配结果的开始位置,第二个表示结束位置,第三个表示在有子串时第一个子串的开始位置,第四个表示第一个子串的结束位置以此类推,第i个子串的开始位置为ovector[i*2],结束位置为ovector[i*2+1],所以在设置该数组大小时应尽量设置一个能被3整除的数为好,最后一个参数则是指定ovector数组的大小。
函数成功返回大于0的数字,出错返回小于0的数字。

第三个参数
int pcre_get_substring(const char *subject, int *ovector,
int stringcount, int stringnumber,
const char **stringptr);

函数功能是得到一个经过pcre_exec匹配后的匹配结果,subject为我们匹配的内容,ovector为经过pcre_exec执行匹配后的数组,stringcount为pcre_exec函数返回的数字,stringnumber为我们要取出的子串(1为第一个子串,0为整个表达式匹配的结果),stringptr为我们取得的字符串写入的位置。

第四个函数
int pcre_get_substring_list(const char *subject,
int *ovector, int stringcount, const char ***listptr);

功能为得到匹配的所有子串,参数跟上面相同,只是最后一个参数是一个指向指针数组的指针,用来保存取得的结果。

第五个函数
void pcre_free_substring(const char *stringptr);
释放pcre_get_substring函数取得结果的内存

第六个函数
void pcre_free_substring_list(const char **stringptr);
释放pcre_get_substring_list函数取得的结果的内存

第七个函数
void pcre_free(pcre *code);
释放pcre_compile返回的数据的内存

基本上有这些函数就已经足够了,下面放上一段简单的c语言使用pcre库的代码

使用gcc编译时记得加-lpcre参数

–阅读次数(84)

发表评论

电子邮件地址不会被公开。

*