繁体   English   中英

JavaScript RegExp for NOT foo AND NOT bar AND NOT baz

[英]JavaScript RegExp for NOT foo AND NOT bar AND NOT baz

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

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

结果将是:

  1. 包含'foo'的所有字符串的一个子集。
  2. 包含'bar'的所有字符串的一个子集。
  3. 一个子集,所有字符串都包含'baz'。
  4. 一个子集一切 (即那些会失败先前的每个正则表达式测试。)

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

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

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

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

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

提前致谢!!!

使用De Morgan的法律 否定的结合是对分离的否定。

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

这应该这样做:

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

感谢所有给予帮助的人!

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

再次感谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM