非常直截了当。在javascript中,我需要检查字符串是否包含数组中持有的任何子字符串。
当前回答
如果您正在处理一长串子字符串,这些子字符串由空格或任何其他常见字符分隔的完整“单词”组成,那么您可以在搜索中使用一些聪明的方法。
首先把你的字符串分成X组,然后X+1,然后X+2,…X和Y应分别为子字符串中单词最少和最多的单词数。例如,如果X是1,Y是4,“Alpha Beta Gamma Delta”变成:
"阿尔法" "贝塔" "伽马" "德尔塔"
"阿尔法·贝塔" "贝塔·伽马" "伽马·德尔塔"
"Alpha Beta Gamma" "Beta Gamma Delta"
"Alpha Beta Gamma Delta"
如果X是2 Y是3,那么你可以省略第一行和最后一行。
现在,如果您将它插入到Set(或Map)中,就可以快速搜索这个列表,比字符串比较快得多。
缺点是你不能搜索像“ta Gamm”这样的子字符串。当然,你可以通过按字符而不是按单词进行分割来实现这一点,但这样你通常需要构建一个庞大的Set,并且这样做所花费的时间/内存超过了好处。
其他回答
var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = 0, len = arr.length; i < len; ++i) {
if (str.indexOf(arr[i]) != -1) {
// str contains arr[i]
}
}
编辑: 如果测试的顺序不重要,你可以使用这个(只有一个循环变量):
var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = arr.length - 1; i >= 0; --i) {
if (str.indexOf(arr[i]) != -1) {
// str contains arr[i]
}
}
function containsAny(str, substrings) {
for (var i = 0; i != substrings.length; i++) {
var substring = substrings[i];
if (str.indexOf(substring) != - 1) {
return substring;
}
}
return null;
}
var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);
基于t。j。克劳德的答案
使用转义的RegExp测试至少一个子字符串的“至少一次”出现。
函数buildSearch(substrings) { 返回新的RegExp( 子字符串 . map(函数(s) {s.replace返回 (/[.*+?^${}()|[\]\\]/ g , '\\$&');}) .join('{1,}|') + '{1,}' ); } var pattern = buildSearch(['hello','world']); console.log(模式。测试('你好')); console.log(模式。Test ('what a wonderful world')); console.log(模式。Test ('my name is…'));
使用underscore.js或lodash.js,你可以对字符串数组执行以下操作:
var contacts = ['Billy Bob', 'John', 'Bill', 'Sarah'];
var filters = ['Bill', 'Sarah'];
contacts = _.filter(contacts, function(contact) {
return _.every(filters, function(filter) { return (contact.indexOf(filter) === -1); });
});
// ['John']
在一个字符串上:
var contact = 'Billy';
var filters = ['Bill', 'Sarah'];
_.every(filters, function(filter) { return (contact.indexOf(filter) >= 0); });
// true
var yourstring = 'tasty food'; // the string to check against
var substrings = ['foo','bar'],
length = substrings.length;
while(length--) {
if (yourstring.indexOf(substrings[length])!=-1) {
// one of the substrings is in yourstring
}
}