JavaScript RegExp for NOT foo AND NOT bar AND NOT baz

时间:2016-08-24 19:41:02

标签: javascript regex

我需要创建一个JavaScript RegExp对象,如果被测试的字符串不包含'foo'且不包含'bar'且不包含'baz',则返回true。

这是一般的想法......我有一个很大的结果集。我需要做一系列使用一系列RegExp.test()过滤和flatMap的函数链。

结果将是:

  1. 包含'foo'的所有字符串的一个子集。
  2. 包含'bar'的所有字符串的一个子集。
  3. 包含'baz'的所有字符串的一个子集。
  4. 其他一切的一个子集(即那些每个失败的子集 以前的RegExp测试。)
  5. 我有1-3完美的工作。它找到了一个很好的方法来做#4,我遇到了麻烦。我试过做一个谓词返回的过滤器

    (false === fooRegex.test(result) && false === barRegext.text && false == bazRegex.test)
    

    不仅麻烦,我还有几个误报。

    我想做的是类似下面的伪代码:

    var myRegex = new RegExp('!foo && !bar && !baz', 'gi')
    

    提前致谢!!!

3 个答案:

答案 0 :(得分:3)

使用De Morgan's laws。否定的结合是对分离的否定。

!string.test(/foo|bar|baz/i);

答案 1 :(得分:0)

这应该这样做:

var arr = 
[
'fooyay',
'baryay',
'yaybazyay',
'yay',
'blah',
'awesome',
'fooxyz',
'barxyz'
]

var fooRegex = /foo/gi
var barRegex = /bar/gi
var bazRegex = /baz/gi

var ih = []
for(var x=0;x<arr.length;x++)
{
    var result = arr[x]
    if(!fooRegex.test(result) && !barRegex.test(result) && !bazRegex.test(result))
    {
        ih.push(result)
    }
}

document.getElementById('out').innerHTML = ih.join('<br>')

它将测试您正在寻找的每个项目,如果没有找到,请添加到将在“out”元素中显示的列表。

答案 2 :(得分:0)

感谢所有给予帮助的人!

我在评论中使用了WiktorStribiżew发布的解决方案:

JavaScript RegExp for NOT foo AND NOT bar AND NOT baz:

/^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/ 

我这样实现了这个:

var catchAllRegExp = new RegExp(/^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/, 'gi')

现在我只是在传递给.filter()的谓词函数中使用catchAllRegExp.test(result)

<强>更新

我正在使用babel / webpack在ES6中工作。但是,在ES5中,上述语法会引发以下错误:

TypeError: Cannot supply flags when constructing one RegExp from another

在正则表达式框架之后直接放置标志解决了这个问题:

var catchAllRegExp = new RegExp(/^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/gi)

然而,我认为使用速记更好:

var catchAllRegExp = /^(?![\s\S]*(?:foo|bar|baz))[\s\S]*$/gi;

再次感谢!