【问题标题】:Fuzzy regex match using TRE使用 TRE 进行模糊正则表达式匹配
【发布时间】:2016-02-04 10:51:16
【问题描述】:

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

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。

【问题讨论】:

  • 好吧,一开始我以为我没有这个功能,因为它在你给的链接中列为tre_regaexec,但在我的regex.h中它只列为regaexec。可能是因为我假设我的版本是 0.7.5。

标签: c regex windows fuzzy-search


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2019-02-18
    相关资源
    最近更新 更多