2

我想检查一个字符串中是否有两个或多个值,无论它们在所述字符串中的位置如何。例如,如果我想要正则表达式中的“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等是从数组中提取的。我尝试过使用 and 的组合,eval()但这indexOf(a) !== -1 && indexOf(b) !== -1太慢了,这就是我转向正则表达式的原因。

4

3 回答 3

2

你可以这样做:

/(?=.*a)(?=.*b)/.test("a")
于 2012-10-12T16:21:59.260 回答
1

@OmarJackman 发布的答案将满足您的要求。然而,值得注意的是,他的解决方案使用了比更简单的正则表达式需要更多处理的环视。如果您正在寻找良好的性能,我建议您只运行两个单独的正则表达式(测试 case a,然后测试 case b)。两个简单的正则表达式比一个复杂的正则表达式运行速度要快几个数量级,尤其是当搜索文本变大时。

编辑:如评论中所述,“数量级”是对性能影响的不公平夸大,但无论如何都应考虑性能。

于 2012-10-12T16:25:49.880 回答
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()它将比正则表达式更快。

于 2012-10-12T19:55:03.663 回答