2016-02-04 24 views
0

我想在我的C程序中使用the TRE library来执行模糊正则表达式搜索。我已经成功地从阅读文档拼凑出这个代码:使用TRE的模糊正则表达式匹配

regex_t rx; 
regcomp(&rx, "(January|February)", REG_EXTENDED); 
int result = regexec(&rx, "January", 0, 0, 0); 

然而,这只会匹配一个确切的正则表达式(即没有拼写错误被允许)。我看不出它允许设置这些功能的模糊任何参数:

int regcomp(regex_t *preg, const char *regex, int cflags); 
int regexec(const regex_t *preg, const char *string, size_t nmatch, 
     regmatch_t pmatch[], int eflags); 

如何设置模糊的水平(即最大Levenshtein距离),以及如何获得本场比赛的Levenshtein距离?

编辑:我忘了提及我正在使用GnuWin32的Windows二进制文件,它仅适用于0.7.5版本。 0.8.0的二进制文件仅适用于Linux。

+0

见http://laurikari.net/tre/documentation/regaexec/ –

+0

好吧,起初我以为我没有这个功能,因为它在你给出的链接中被列为'tre_regaexec',但它在我的'regex.h'中被列为只有'regaexec'。可能是因为我的版本是0.7.5我认为。 – sashoalm

回答

1

感谢@WiktorStribiżew,我发现它的功能,我需要用的,我已经成功地编制工作的例子:

#include <stdio.h> 
#include "regex.h" 
int main() { 
    regex_t rx; 
    regcomp(&rx, "(January|February)", REG_EXTENDED); 

    regaparams_t params = { 0 }; 
    params.cost_ins = 1; 
    params.cost_del = 1; 
    params.cost_subst = 1; 
    params.max_cost = 2; 
    params.max_del = 2; 
    params.max_ins = 2; 
    params.max_subst = 2; 
    params.max_err = 2; 

    regamatch_t match; 
    match.nmatch = 0; 
    match.pmatch = 0; 

    if (!regaexec(&rx, "Janvary", &match, params, 0)) { 
     printf("Levenshtein distance: %d\n", match.cost); 
    } else { 
     printf("Failed to match\n"); 
    } 

    return 0; 
}