在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%
或更多的字符串。
答案 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