2016-09-21 11 views
1

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

を私はあなたがレーベンシュタイン距離のようなものを探していると思いますが、わかりませんあなたが使用しているdbエンジンとサポートしているエンジンあなたの最初の正規表現に関連する: 'Table.where(" string =〜? "、" A * E * 1 * 8 * B * X * 2 * 1 * ') ' –

+0

ええ、私は考えなかったレーベンシュタイン距離。私はPostgresSQLを使用しています。それを確認してください。 – cal1801

答えて

0

あなたの質問を読んだ後、あなたはLevenshtein distanceのようなものがほしいと思うし、あなたのコメントに述べたように、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 
+0

リンクありがとうございます。たくさん助けてくれました。私はpostgresにインストールされたfuzzystrmatchを取得し、これは素晴らしいだろう! – cal1801

関連する問題