如何有效地检查数组中的任何子字符串是否包含在另一个字符串中

时间:2014-06-27 16:35:15

标签: javascript arrays string search

我想要检查字符串列表中是否包含字符串列表中的任何子字符串。我有一些有用的东西,但我希望有一些更干净,更有效的东西,最好只在一行中我可以调用if(string.contains(list.any))或其他东西。

var list = ['aa','bb','cc','dd'];
var string = "nygaard"; // true because "aa" is in "nygaard".

for (var i = 0; i < list.length; i++) {
    if( string.indexOf( list[i] ) > -1 ) {
        alert("True");
        break;
    }
}

3 个答案:

答案 0 :(得分:3)

var list = ['aa','bb','cc','dd'];
var string = "nygaard"; 
var patt = new RegExp(list.join('|'))
// regEx -  /aa|bb|cc|dd/
patt.test(string)
//output true

Demo

<强>解释

  • 使用new RegExp
  • 动态创建regEx
  • 用于检查多个SubString的存在,我们在RegEx中有|运算符
  • 使用Array.join('|')动态制作像aa|bb|cc
  • 这样的regExp
  • 使用test func验证字符串

编辑 - 对于复杂案例 - 问题是列表中的字符串可能必须转义才能使RegEx正常工作,指点 - @GabrielRatener

与我的解决方案相比,@ GabrielRatener的解决方案更好

var list = ['aa','bb','cc','dd', 'ab?', '(aa)'];
list = list.sort(function(a, b) {
    if (a>b) return -1;
    else if (a<b) return 1;
    else return 0;
});
list = list.join(" ").replace(/[^\w\s]/g, function($1) {
return '\\' + $1
}).split(/\s/);
//["dd", "cc", "bb", "ab\?", "aa", "\(aa\)"]
//sorting needed to match "ab?" before single "a" as "b" will become optional
//due to "?"

//after processing
var string = "nygaard"; 
var patt = new RegExp(list.join('|')) // RegExp ->  /dd|cc|bb|ab\?|aa|\(aa\)/
patt.test(string)
//true

答案 1 :(得分:2)

为什么不把你的循环放在你可以调用的自己的函数中?

function stringContains(string, list) {
    for (var i = 0; i < list.length; i++) {
        if( string.indexOf( list[i] ) > -1 )
            return true;
    }
    return false;
}

然后像这样调用它:

var list = ['aa','bb','cc','dd'];
var string = "nygaard";

if(stringContains(string, list))
   alert("True");

如果你正在寻找一个javascript库函数,我不相信它有一个。

答案 2 :(得分:2)

EcmaScript 6正在为字符串提出一种包含方法,以便您可以这样做:

function stringContainsArray(str, array){
    for (var i = 0; i < array.length; i++){
        if (str.contains(array[i])){
            return true;
        }
    }
    return false;
}

var list = ['aa','bb','cc','dd'];
var string = "nygaard"; // true because "aa" is in "nygaard".

console.log(stringContainsArray(list));
//  => true

由于在不久的将来,主要浏览器和其他运行时的实现可能仍然不稳定,因此您应该在stringContainsArray函数之前添加以下代码以实现兼容性:

// String.prototype.contains will be implemented in
// the major browsers in the not too distant future
// this will add the same functionality to browsers
// or other runtimes that do not currently support it
if ( !String.prototype.contains ) {
    String.prototype.contains = function() {
        return String.prototype.indexOf.apply( this, arguments ) !== -1;
    };
}

这可能有所帮助:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/contains

您还可以将字符串原型扩展为一个简单的方法:

String.prototype.containsArray = function(array){
    return stringContainsArray(this, array);
}

然后你可以简单地做:

"nygaard".containsArray(list);
//  => true