正则表达式-检查字符串是否包含字符串数组中的所有字符串

时间:2018-11-28 10:23:44

标签: javascript arrays regex string

我有一个搜索,它将检查string是否包含搜索查询中的所有字符串。我设法使用循环来做到这一点。但是如何使用正则表达式呢?

这是我当前的代码。

var itemMatches = [];
var itemStr = 'The quick brown fox jumps over the lazy dog';
var search = 'dog over  jumps   quick';

// split by spaces,filter to remove empty in array due to double space
var arrStr =  search.split(' ').filter(function(str) { return str });

// check if string exist
for (var i = 0; i < arrStr.length; i++) {

    var text = arrStr[i].toString().toLowerCase();

    if (itemStr.indexOf(text) !== -1) {
        itemMatches.push(true);
    } else {
        itemMatches.push(false);
    } 
}

// if all string exist
if (itemMatches.every(isAllTrue)) {
    // all matched !!
}

// if array all true
function isAllTrue(key) {
    return key;
}

2 个答案:

答案 0 :(得分:1)

选择字符串使用中的所有单词,然后使用.every()检查所有项是否返回true

var itemStr = 'The quick brown fox jumps over the lazy dog';
var search = 'dog over  jumps   quick';

var res = search.match(/\S+/g).every(function(val){
  return itemStr.indexOf(val) > -1;
});
console.log(res);

答案 1 :(得分:0)

将每个单词转换为(?=.*${word})形式的前瞻,并将所有前瞻彼此相邻,以产生类似(?=.*foo)(?=.*bar)的模式。在开头添加一个^(以确保在不可能的情况下正则表达式在第一个字符上快速失败),然后将其传递给new RegExp

var itemStr = 'The quick brown fox jumps over the lazy dog';
var search = 'dog over  jumps   quick';

const toPattern = search => new RegExp(
  '^' + 
  search
    .match(/\S+/g)
    .map(word => `(?=.*${word})`)
    .join('')
);

console.log(toPattern(search).test(itemStr));
console.log(toPattern('dog cat').test(itemStr));

请注意,如果任何非空白字符在正则表达式中包含具有特殊含义的字符,例如^$(,依此类推,您必须先将其转义:

const escape = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
const toPattern = search => new RegExp(
  '^' + 
  search
    .match(/\S+/g)
    .map(escape)
    .map(word => `(?=.*${word})`)
    .join('')
);