我需要创建一个JavaScript RegExp对象,如果被测试的字符串不包含'foo'且不包含'bar'且不包含'baz',则返回true。
这是一般的想法......我有一个很大的结果集。我需要做一系列使用一系列RegExp.test()过滤和flatMap的函数链。
结果将是:
我有1-3完美的工作。它找到了一个很好的方法来做#4,我遇到了麻烦。我试过做一个谓词返回的过滤器
(false === fooRegex.test(result) && false === barRegext.text && false == bazRegex.test)
不仅麻烦,我还有几个误报。
我想做的是类似下面的伪代码:
var myRegex = new RegExp('!foo && !bar && !baz', 'gi')
提前致谢!!!
答案 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;
再次感谢!