APR(Apache Portable Runtime)1.2.2 RegEx?

时间:2010-06-08 17:05:57

标签: c++ apache-portable-runtime

APR 1.2.2是否支持正则表达式?有关使用它的任何文档或教程吗?

文档太糟糕了。就像真的很糟糕。

2 个答案:

答案 0 :(得分:4)

以下内容直接来自本书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()编译正则表达式字符串,但它会自动分配 来自提供的资源池指针的已编译表达式的内存。图案 包含要编译的字符串,cflags是控制其类型的标志的位掩码 要执行的正则表达式。可以在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() 根据在操作期间匹配的子表达式执行一系列字符串替换。此函数使用pmatch []数组,其中regexec()填充了正则表达式匹配的所有带括号的子表达式的起始位置和结束位置。您为ap_pregsub()提供了p,资源池指针,输入,描述要执行的替换的字符串,源,用于正则表达式匹配的源字符串,nmatch,pmatch数组的大小以及pmatch本身。 input是包含表达式$ 1到$ 9的任意字符串。 ap_pregsub()用源字符串中相应的匹配子表达式替换这些表达式。 $ 0也可供您使用:它对应于整个匹配的字符串。 返回值将是由替换输入字符串形成的新分配字符串。

以下示例显示了用于替换.htm和.HTM的ap_pregsub() 带.html的文件扩展名。我们首先调用ap_pregcomp()来编译所需的 正则表达式并将已编译的模式返回到从资源分配的内存中 池。我们指定导致匹配不区分大小写的标志并使用现代标记 正则表达式语法。我们继续初始化pmatch []数组以保存两个regmatch_t元素。需要两个元素:第一个对应于$ 0和 第二个是模式中单个带括号的子表达式。接下来,我们使用编译的模式,请求的文件名,pmatch []数组及其长度调用regexec()。 regexec()的最后一个参数(用于传递各种附加选项标志)设置为零。如果regexec()返回零,我们继续调用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);
}

答案 1 :(得分:0)

我同意,文件很糟糕。

看这里:

http://apr.apache.org/docs/apr-util/1.2/files.html

我冒昧地猜测不,1.2.2中没有正则表达式。