2つの文字列に同じ部分文字列が含まれているかどうかをJavaScriptですばやく確認する方法はありますか? たとえば、「audi is a car」と「audiA8」という 2 つの文字列があります。
indexOf
ご覧のとおり、「audi」という単語は両方の文字列にありますが、両方の文字列に他の文字があるため、単純または正規表現では見つけることができません。
2つの文字列に同じ部分文字列が含まれているかどうかをJavaScriptですばやく確認する方法はありますか? たとえば、「audi is a car」と「audiA8」という 2 つの文字列があります。
indexOf
ご覧のとおり、「audi」という単語は両方の文字列にありますが、両方の文字列に他の文字があるため、単純または正規表現では見つけることができません。
バイオインフォマティクスでこの種のことを行うための標準ツールは、BLASTプログラムです。分子の 2 つの断片 (DNA やタンパク質など) を比較して、それらが互いに整列する場所を見つけるために使用されます。基本的には、2 つの文字列 (場合によっては数 GB のサイズ) が共通の部分文字列を共有する場所です。
基本的なアルゴリズムは単純で、文字列の 1 つを体系的に断片に分割し、その断片を他の文字列と比較するだけです。簡単な実装は次のようになります。
// Note: not fully tested, there may be bugs:
function subCompare (needle, haystack, min_substring_length) {
// Min substring length is optional, if not given or is 0 default to 1:
min_substring_length = min_substring_length || 1;
// Search possible substrings from largest to smallest:
for (var i=needle.length; i>=min_substring_length; i--) {
for (j=0; j <= (needle.length - i); j++) {
var substring = needle.substr(j,i);
var k = haystack.indexOf(substring);
if (k != -1) {
return {
found : 1,
substring : substring,
needleIndex : j,
haystackIndex : k
}
}
}
}
return {
found : 0
}
}
このアルゴリズムを変更して、大文字と小文字の区別を無視したり、部分文字列のファジー マッチングを行ったり、複数の部分文字列を検索したりするなど、より洗練された検索を行うことができます。これは基本的な考え方にすぎません。
より簡単な方法については知りませんが、これはうまくいくはずです:
if(a.indexOf(substring) != -1 && b.indexOf(substring) != -1) { ... }
とはあなたの文字列ですa
。b
ここで同様のテキスト関数の実装を見てください。両方の文字列で一致する文字の数を返します。
あなたの例では、次のようになります。
similar_text("audi is a car", "audiA8") // -> 4
これは、文字列に 4 文字の共通部分文字列があることを意味します。
var a = "audi is a car";
var b = "audiA8";
var chunks = a.split(" ");
var commonsFound = 0;
for (var i = 0; i < chunks.length; i++) {
if(b.indexOf(chunks[i]) != -1) commonsFound++;
}
alert(commonsFound + " common substrings found.");