为给定的字符串生成正则表达式并编辑距离

时间:2012-11-02 17:10:27

标签: php mysql regex edit-distance

我遇到的问题是我想匹配数据库中与给定字符串有一定编辑距离的所有字符串。

我的想法是生成一个正则表达式,将所有字符串与编辑距离d匹配到字符串s

例如,我希望以r的形式为d = 1s = 'abc'生成正则表达式r = 'abc|.abc|.bc|a.c|ab.|abc.',依此类推。但我不确定这是非常有效还是已经有一些很好的算法来解决这个问题?我想在编辑距离中考虑甚至字符交换。因此'acb'也应该是r的一部分。我想在PHP中实现它,然后进行SQL查询:SELECT * FROM table WHERE name RLIKE TheRegularExpression

这样做的好方法吗?或者你会推荐什么?

3 个答案:

答案 0 :(得分:5)

您可以在Mysql中存储Levenshtein function。之后,您可以像这样进行搜索:

mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND '$d'");

答案 1 :(得分:1)

您需要Levenshtein Distance的实现(或类似的东西)。这是一个用于MySQL的function definition

答案 2 :(得分:1)

可能最好的办法是为所有可能性建立一个迭代过程。换句话说,就像这样:

function findall($startString) {
    // create an array of all strings that are distance one away
    // each element would be $returnArray["abc"] = "abc";
}

$d = 2; // distance
$myArray[$startString] = $startString;

for($i = 0; $i < $d; $i++) {
    $newCombos = array_merge(array(), $myArray);
    foreach($myArray as $element) {
        $newCombos = array_merge($newCombos, findall($element));
    }
    $myArray = array_merge(array(), $newCombos);
}

$myRegex = implode("|", $myArray);