检查两个字符串是否在JavaScript中共享一个公共子字符串

时间:2012-10-22 07:13:14

标签: javascript

  

可能重复:
  Optimum way to compare strings in Javascript?

在JavaScript中是否有任何快速方法可以找出2个字符串是否包含相同的子字符串?例如我有这两个字符串:"奥迪是一辆汽车"和" audiA8"。

当你看到" audi"在两个字符串中,但我们无法通过简单的indexOf或RegExp找到它,因为两个字符串中都包含其他字符。

4 个答案:

答案 0 :(得分:4)

不知道任何更简单的方法,但这应该有效:

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

其中ab是您的字符串。

答案 1 :(得分:4)

在生物信息学中执行此类操作的标准工具是BLAST程序。它用于比较分子的两个片段(如DNA或蛋白质),以找到它们彼此对齐的位置 - 基本上两个字符串(有时大小为多GB)共享共同的子串。

基本算法很简单,只需系统地将其中一个字符串拆分成片段,然后将这些字符串与另一个字符串进行比较。一个简单的实现类似于:

// 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
    }
}

您可以修改此算法以执行更多花哨的搜索,例如忽略大小写,模糊匹配子字符串,查找多个子字符串等。这只是基本的想法。

答案 2 :(得分:2)

看一下类似的文本函数实现here。它返回两个字符串中匹配字符的数量。

对于你的例子,它将是:

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

表示字符串具有4个字符的公共子字符串。

答案 3 :(得分: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.");