我正在尝试搜索字符串并从数组中一次查找多个匹配项。
我使用'|'
加入了我的数组项,但我得到null
。
var searchTerms = ['dog', 'cat'];
var str = 'I have a dog and a cat';
// want to return matches for both dog and cat
console.log(str.match('/' + searchTerms.join('|') + '/g'));
答案 0 :(得分:4)
像这样使用RegExp
:
var searchTerms = ['dog', 'cat'];
var str = 'I have a dog and a cat';
console.log(str.match(new RegExp(searchTerms.join('|'), 'g')));
答案 1 :(得分:1)
您需要使用new RegExp(..., 'g')
console.log(str.match(new RegExp(searchTerms.join('|'), 'g')));
答案 2 :(得分:1)
如果您想从字符串中动态创建RegExp对象,则需要使用constructor:
console.log(str.match(new RegExp(searchTerms.join('|'), 'g')));
但是,我通常会推荐一些其他方法。如果您的搜索字词包含特殊的正则表达式字符(例如$
),则可能会失败。当然你可以逃脱那些特殊角色,但是,如果可能的话,我建议你寻找其他解决方案。
很难确切地说出解决方案的样子,因为我不知道完整的用例,但这是一个非常简单的替代解决方案示例:
var str = 'I have a dog and a cat';
var searchTerms = {'dog': 1, 'cat': 1};
console.log(str.split(/\s+/).filter(function(x) { return x in searchTerms; }));
// [ "dog", "cat" ]
答案 3 :(得分:1)
您还可以使用Array.reduce()
以及Str.indexOf
,如果找不到字符串,则返回-1
:
var searchTerms = ['dog', 'cat'];
var str = 'I have a dog and a cat';
searchTerms.reduce(function(prev, curr) { return prev && str.indexOf(curr) !== -1 });
// true
str = 'I only have a dog';
searchTerms.reduce(function(prev, curr) { return prev && str.indexOf(curr) !== -1 });
// false
prev
是一个累加器,只要找到数组的所有元素,它就会保持true
。
使用此方法优于正则表达式的优势在于searchTerms
中的字符以不正常的方式被解释的可能性较小。
答案 4 :(得分:0)
您要做的是(option1|option2|...|optionN)
注意括号的语法,我不认为您已添加它们。
尝试使用:console.log(str.match('/(' + searchTerms.join('|') + ')/g'));