检查长度为5的子字符串是否在另一个字符串中(已重构)

checking if a substring of length 5 is in another string (refactored)

本文关键字:字符串 另一个 重构 是否 检查      更新时间:2023-09-26

我正在尝试检查字符串b是否包含任何5个字符的子字符串a

这是有效的,但有点混乱:

var a = "1eabcde";
var b = "12abcde12fg";
    for(var i=0; i<a.length; i++){
        for(var j=i;j<a.length-i;j++){
            if(a.charAt(j) == b.charAt(i) && a.charAt(j+1) == b.charAt(i+1) && a.charAt(j+2) == b.charAt(i+2) && a.charAt(j+3) == b.charAt(i+3) && a.charAt(j+4) == b.charAt(i+4)){
                alert("ya");
             }                              
         }
     }

还有其他更清洁的选择吗?

您可以使用substringindexOf:

var a = "1eabcde";
var b = "12abcde12fg";
for (var i = 0; i <= a.length - 5; i++) {
    if (b.indexOf(a.substring(i, i + 5)) >= 0) {
        alert("ya");
    }
}

(您可以使用a.substr(i, 5)而不是a.substring(i, i + 5)。这两个调用的行为相同。)

请注意,如果从0循环到a.length(如原始代码中所示),则将在b中搜索长度为5或更小的a的所有后缀。

在一个方面,此代码的行为与原始代码不同:对于a的每个匹配子字符串,它只会发出一次警报,而不管该特定子字符串在b中可能出现多少次。因此,如果是a = 'abcde'b = '01abcde23abcde45,您的原始代码将弹出两个警报(每次出现'abcde'一个),而以上代码将只发出一次警报。如果您想要原始行为,请将if更改为while,如下所示:

for (var i = 0; i <= a.length - 5; i++) {
    var j = -1;
    while ((j = b.substring(j+1).indexOf(a.substr(i, 5))) >= 0) {
        alert("ya");
    }
}

这是最干净的方法:

var a = "1eabcde";
var b = "12abcde12fg";
for (var i = 0; i <= a.length - 5; i++) {
    if(b.indexOf(a.substr(i, 5)) > -1) {
        alert("ya");
    }
}