[英]Given a function pipe(foo, bar, baz)(1, 2, 3), how would you implement it to be equivalent to baz(bar(foo(1,2,3)) in javascript
[英]JavaScript RegExp for NOT foo AND NOT bar AND NOT baz
我需要创建一个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')
提前致谢!!!
使用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.