如何将字符串与另一个几乎相同的字符串匹配(模糊匹配)

时间:2016-09-21 19:16:43

标签: ruby-on-rails regex

在Rails中,我传递了一个字符串:'AE18BX21'。我正在查询数据库以查找与输入字符串匹配的字符串。但是,输入字符串和数据库中的字符串有时不匹配。有时会有一个额外的字母/数字,有时会丢失一个字母/数字,或者有时字母/数字是不同的字母/数字。

我尝试了一些不同的正则表达式,如:

Table.where("string =~ ?", 'A+E+1+8+B+X+2+1')

Table.where("string =~ ?", '(A|.)+(E|.)+(1|.)+(8|.)+(B|.)+(X|.)+(2|.)+(1|.)')

在一个理想的世界中,我希望它只返回匹配80%或更多的字符串。

1 个答案:

答案 0 :(得分:2)

在读完你的问题后,我想你想要像Levenshtein这样的距离,正如你在评论中所说,对于Postgres,你可以使用它。

在此引用其文档: https://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 levenshtein
-------------
           2
(1 row)

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1);
 levenshtein
-------------
           3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2);
 levenshtein_less_equal
------------------------
                      3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4);
 levenshtein_less_equal
------------------------
                      4
(1 row)

然后你可以用你想要的距离建立你的SQL查询:

SELECT * 
FROM YourTable
WHERE levenshtein(string , 'AE18BX21') <= 2