APR 1.2.2支持正则表达式吗?有没有关于使用它的文档或教程?
文档很烂。真的很糟糕。
发布于 2010-10-24 22:40:59
以下内容直接摘自Writing Apache modules with Perl and C一书
regex_t *ap_pregcomp (pool *p, const char *pattern, int cflags);
void ap_pregfree (pool *p, regex_t *reg);Apache支持使用系统库的正则表达式例程regcomp()、regexec()、regerror()和regfree()进行正则表达式匹配。如果这些函数不可用,Apache将使用自己的正则表达式例程包。有关正则表达式例程的文档可以在系统手册页中找到。如果您的系统不支持这些例程,可以在Apache源代码树的regex/子目录中找到Apache正则表达式包的文档。
正则表达式匹配分两个阶段进行。在第一阶段,调用regcomp()将正则表达式模式字符串编译成编译后的形式。在第二阶段,将编译后的模式传递给regexec(),以将搜索模式与源字符串进行匹配。在执行正则表达式匹配的过程中,regexec()将每个匹配的带括号的子表达式的偏移量写入名为pmatch[]的数组中。这个数组的重要性很快就会显现出来。
Apache提供了围绕regcomp()和regfree()的包装器例程,这使得使用正则表达式变得更加简单。ap_pregcomp()与regcomp()类似,用于编译正则表达式字符串,不同之处在于它会自动从提供的资源池指针为编译后的表达式分配内存。pattern包含要编译的字符串,而cflag是控制要执行的正则表达式类型的标志的位掩码。完整的标志列表可以在regcomp()手册页面中找到。
除了分配正则表达式之外,ap_pregcomp()还会自动安装一个清理处理程序,该处理程序在事务完成时调用regfree()来释放已编译的正则表达式所使用的内存。
说到这里,ap_pregcomp()安装的清理处理程序是ap_pregfree()。它通过调用regfree()释放正则表达式,然后将其自身从清理处理程序列表中删除,以确保它不会被调用两次。如果出于某种不太可能的原因,在正常执行清理之前需要释放正则表达式使用的内存,则可以自己调用ap_pregfree()。
char *ap_pregsub (pool *p, const char *input, const char *source, size_t nmatch,
regmatch_t pmatch[ ])在使用regexec()执行正则表达式匹配之后,可以使用ap_pregsub()根据操作期间匹配的子表达式执行一系列字符串替换。此函数使用regexec()数组,该数组填充与正则表达式匹配的所有带括号的子表达式的开始和结束位置。向ap_pregsub()提供p、资源池指针、输入、描述要执行的替换的字符串、源、用于正则表达式匹配的源字符串、nmatch、pmatch数组的大小和pmatch本身。input是包含表达式$1到$9的任意字符串。ap_pregsub()将这些表达式替换为源字符串中相应的匹配子表达式。$0也可供您使用:它对应于整个匹配的字符串。返回值将是由替换的输入字符串形成的新分配的字符串。
下面的示例显示了如何使用ap_pregsub()将.htm和.HTM文件扩展名替换为.html。我们首先调用ap_pregcomp()来编译所需的正则表达式,并在从资源池分配的内存中返回编译后的模式。我们指定使匹配不区分大小写并使用现代正则表达式语法的标志。我们继续初始化pmatch[]数组以容纳两个regmatch_t元素。需要两个元素:第一个元素对应于$0,第二个元素对应于模式中的单个带括号的子表达式。接下来,我们使用编译后的模式、请求的文件名、pmatch[]数组及其长度调用regexec()。regexec()的最后一个参数被设置为零,该参数用于传递各种附加选项标志。如果regexec()返回0,我们继续调用ap_pregsub()将匹配的子表达式(文件名减去其扩展名)插入到字符串$1.html中,从而有效地替换了扩展名。
ap_regmatch_t pmatch[2];
ap_regex_t *cpat = ap_pregcomp(r->pool, "(.+)\\.htm$",
AP_REG_EXTENDED|AP_REG_ICASE);
if (ap_regexec(cpat, r->filename, cpat->re_nsub+1, pmatch, 0) == 0)
{
r->filename = ap_pregsub(r->pool, "$1.html",
r->filename, cpat->re_nsub+1,
pmatch);
}发布于 2010-06-09 01:28:19
我同意,文档很糟糕。
看这里:
http://apr.apache.org/docs/apr-util/1.2/files.html
我敢说不,在1.2.2中没有正则表达式。
https://stackoverflow.com/questions/2999559
复制相似问题