在字符串中查找多个子字符串

时间:2012-10-12 16:19:41

标签: javascript regex

我想检查字符串中是否有两个或更多值,无论它们在所述字符串中的位置如何。例如,如果我想在正则表达式中使用“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

显然这种语法不正确......

从数组中提取这些值abc等。我尝试过使用eval()indexOf(a) !== -1 && indexOf(b) !== -1的组合,但这太慢了,这就是为什么我要转向正则表达式。

3 个答案:

答案 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>