我想检查字符串中是否有两个或更多值,无论它们在所述字符串中的位置如何。例如,如果我想在正则表达式中使用“OR”条件,我会这样做:
/(a|b)/.test("a") // true
但我需要的是“AND”;像这样的东西:
/(a&b)/.test("a") // false
/(a&b)/.test("b") // false
/(a&b)/.test("a b") // true
/(b&a)/.test("a b") // true
/(a&b&c)/.test("a b") // false
/(a&b&c)/.test("a c b") // true
显然这种语法不正确......
从数组中提取这些值a
,b
,c
等。我尝试过使用eval()
和indexOf(a) !== -1 && indexOf(b) !== -1
的组合,但这太慢了,这就是为什么我要转向正则表达式。
答案 0 :(得分:2)
你可以这样做:
/(?=.*a)(?=.*b)/.test("a")
答案 1 :(得分:1)
@OmarJackman发布的答案将满足您的要求。但是,值得注意的是,他的解决方案使用了比简单的正则表达式需要更多处理的外观。如果您正在寻找良好的性能,我建议您只运行两个单独的正则表达式(对案例a
进行测试,然后对案例b
进行测试)。两个简单的正则表达式将比一个复杂的表达式快几个数量级,特别是当搜索文本变大时。
编辑:正如评论中所述,“数量级”是对性能影响的不公平夸大,但无论如何都应考虑性能。
答案 2 :(得分:1)
由于你匹配固定字符串,你可以使用:
function matchAll(str, arr)
{
for (var i=0; i<arr.length; ++i) {
if (str.indexOf(arr[i]) === -1) {
return false;
}
}
return true;
}
matchAll('a', ['a']); // true
matchAll('a', ['a', 'b']); // false
matchAll('a b', ['a', 'b']); // true
matchAll('a b c', ['a', 'b']); // true
matchAll('a b', ['a', 'b', 'c']); // false
matchAll('a c b', ['a', 'b', 'c']); // true
matchAll('c a b', ['a', 'b', 'c']); // true
如果您正在寻找固定字符串,.indexOf()
将比正则表达式更快。</ p>