JavaScript中是否有任何快速方法可以找出2个字符串是否包含相同的子字符串?例如,我有这两个字符串:“audi is a car”和“audiA8”。
如您所见,“audi”一词在两个字符串中都有,但我们无法用简单的indexOf
或正则表达式找到它,因为两个字符串中都有其他字符。
JavaScript中是否有任何快速方法可以找出2个字符串是否包含相同的子字符串?例如,我有这两个字符串:“audi is a car”和“audiA8”。
如您所见,“audi”一词在两个字符串中都有,但我们无法用简单的indexOf
或正则表达式找到它,因为两个字符串中都有其他字符。
在生物信息学中做这类事情的标准工具是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
}
}
您可以修改此算法以进行更多花哨的搜索,例如忽略大小写、模糊匹配子字符串、查找多个子字符串等。这只是基本思想。
不知道任何更简单的方法,但这应该有效:
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.");