Javascript - 如何通过多个字符串进行搜索

时间:2015-05-27 00:52:36

标签: javascript regex

假设我有一个类似的搜索字词:"ice cream"

让我说我有三个字符串如此:

["Jeni's Ice Cream","Ice Cream Labs","Zumbacream"]

如何使用正则表达式匹配列表中的前两项而不是第三项?

4 个答案:

答案 0 :(得分:3)

var items = ["Jeni's Ice Cream","Ice Cream Labs","Zumbacream"]

var searchTerm = 'Ice Cream';

for (var i = 0; i < items.length; i++){
    if (items[i].indexOf(searchTerm) > -1){
        console.log(items[i] + " - matched");
    } else {
        console.log(items[i] + " - unmatched");
    }
}

对于非敏感的套管

var items = ["Jeni's Ice Cream","Ice Cream Labs","Zumbacream"]

var searchTerm = 'ice cream';

searchTerm = searchTerm.toLowerCase();

for (var i = 0; i < items.length; i++){
    if (items[i].toLowerCase().indexOf(searchTerm) > -1){
        console.log(items[i] + " - matched");
    } else {
        console.log(items[i] + " - unmatched");
    }
}

或者,您可以创建一个Array原型并使用过滤器函数

Array.prototype.search = function(searchTerm, caseSensitive){
    if (!caseSensitive){
        searchTerm = searchTerm.toLowerCase();
    }
    function search(value){
        if (!caseSensitive){
            value = value.toLowerCase();
        }
        return value.indexOf(searchTerm) > -1;
    }

    return this.filter(search);
}

使用此

items.search('ice cream', false)

这将返回

["Jeni's Ice Cream", "Ice Cream Labs"]

答案 1 :(得分:0)

虽然这在大规模上效率低下(这是制作数据库引擎的原因之一),但您可以索引每个项目并查看它是否与searchTerm匹配

var searchTerm = "ice cream",
searchTermRgx = new RegExp(searchTerm, "i");
database = [
    "Jamen's Ice Cream Shop", 
    "Dat good ice cream", 
    "Pizza Place",
    "More Ice Cream"
], i,
searchResults = [];

for (i=0; i<database.length; i++) {
  if ((searchTermRgx).test(database[i])) searchResults.push(database[i]);
}

document.body.innerHTML = searchResults;

(请注意,使用RegEx i运算符,它不区分大小写)

JSFiddle Example

答案 2 :(得分:0)

要添加杨力的答案,我会将搜索词分成一个空格,以便您可以检查字符串是否包含搜索词,但是词的顺序无关紧要,即如果它匹配字符串包含搜索词的每个单词,但不一定是相同的顺序:

var items = ["Jeni's Ice Cream","Ice Cream Labs","Zumbacream"]

var searchTerm = 'Ice Cream';
searchTerm = searchTerm.toLowerCase();
var searchTerms = searchTerms.split(' ');

for (var i = 0; i < items.length; i++){
    for (var i2 = 0; i < searchTerms.length; i2++){
        if (items[i].toLowerCase().indexOf(searchTerms[i2]) == -1) { // if the string we're checking does not contain a word in the search term
            break;
        } else if (i2 < searchTerms.length - 1) { // or if it's not the last word of the search term
            continue;
        }
        // if it's the last search term and the string contains all of the search words
        alert(items[i] + " - matched");
    }
}

小提琴:http://jsfiddle.net/rd8ujg1t/2/

答案 3 :(得分:0)

对于正则表达式版本:

var items = ["Jeni's Ice Cream","Ice Cream Labs","Zumbacream"];
var term = /Ice Cream/i;//take the i out for a case sensitive search

var matched = items.filter(function(comp){return comp.match(term) != null;});