使用TRE进行模糊正则表达式匹配

时间:2016-02-04 10:51:17

标签: c regex windows fuzzy-search

我正在尝试在我的C程序中使用the TRE library来执行模糊正则表达式搜索。我已经设法通过阅读文档来拼凑这些代码:

$result = $document_manager
    ->createQueryBuilder('AppBundle:User')
    ->findAndUpdate()
    ->returnNew()
    ->field($field)->set($value)
    ->field('id')->equals($given_id)
    ->getQuery()
    ->execute();

但是,这只会匹配一个精确的正则表达式(即不允许拼写错误)。我没有看到任何允许在这些函数中设置模糊性的参数:

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

如何设置模糊度(即最大Levenshtein距离),以及如何获得匹配的Levenshtein距离?

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

1 个答案:

答案 0 :(得分:2)

感谢@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;
}