7

2つの文字列に同じ部分文字列が含まれているかどうかをJavaScriptですばやく確認する方法はありますか? たとえば、「audi is a car」と「audiA8」という 2 つの文字列があります。

indexOfご覧のとおり、「audi」という単語は両方の文字列にありますが、両方の文字列に他の文字があるため、単純または正規表現では見つけることができません。

4

4 に答える 4

8

バイオインフォマティクスでこの種のことを行うための標準ツールは、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
    }
}

このアルゴリズムを変更して、大文字と小文字の区別を無視したり、部分文字列のファジー マッチングを行ったり、複数の部分文字列を検索したりするなど、より洗練された検索を行うことができます。これは基本的な考え方にすぎません。

于 2012-10-22T07:50:55.103 に答える
4

より簡単な方法については知りませんが、これはうまくいくはずです:

if(a.indexOf(substring) != -1 && b.indexOf(substring) != -1) { ... }

とはあなたの文字列ですab

于 2012-10-22T07:18:43.290 に答える
2

ここで同様のテキスト関数の実装を見てください。両方の文字列で一致する文字の数を返します。

あなたの例では、次のようになります。

similar_text("audi is a car", "audiA8") // -> 4

これは、文字列に 4 文字の共通部分文字列があることを意味します。

于 2012-10-22T08:13:26.043 に答える
0
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.");
于 2012-10-22T07:34:39.027 に答える