我有一个搜索,它将检查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;
}
答案 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('')
);