首页 文章

JavaScript RegExp for NOT foo AND NOT bar AND NOT baz

提问于
浏览
1

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

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

结果将是:

  • 包含'foo'的所有字符串的一个子集 .

  • 包含'bar'的所有字符串的一个子集 .

  • 包含'baz'的所有字符串的一个子集 .

  • 一个带有 everything else 的子集(即那些先前的RegExp测试失败 each 的子集 . )

我有1-3完美的工作 . 它找到了一个很好的方法来做#4,我遇到了麻烦 . 我试过做一个谓词返回的过滤器

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

这不仅麻烦,而且还有几个误报 .

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

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

提前致谢!!!

3 回答

  • 0

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

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

    这应该这样做:

    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”中显示的列表 .

  • 0

    感谢所有给予帮助的人!

    我在评论中使用了 Wiktor Stribiż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) .

    UPDATE:

    我正在使用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;
    

    再次感谢!

相关问题