假设我有两个数组:一个是正则表达式,另一个是输入。那么,在性能和可读性方面,做出类似输出的最佳方法是什么?
var regex = [
'/rat/',
'/cat/'
'/dog/',
'/[1-9]/'
]
var texts = [
'the dog is hiding',
'cat',
'human',
'1'
]
最终结果是
result = [
'human'
]
嗯,我在想的是做reduce
:
// loop by text
for (var i = texts.length - 1; i >= 0; i--) {
// loop by regex
texts[i] = regex.reduce(function (previousValue, currentValue) {
var filterbyRegex = new RegExp("\\b" + currentValue + "\\b", "g");
if (previousValue.toLowerCase().match(filterbyRegex)) {
delete texts[i];
};
return previousValue;
}, texts[i]);
}
但是,这不可读吗?也许还有另一种我没有想过的方式。
答案 0 :(得分:9)
我可能会这样做
var regexs = [
/rat/i,
/cat/i,
/dog/i,
/[1-9]/i
]
var texts = [
'the dog is hiding',
'cat',
'human',
'1'
]
var goodStuff = texts.filter(function (text) {
return !regexs.some(function (regex) {
return regex.test(text);
});
});
但实际上,除非你做了10,000次,否则性能差异在这里可以忽略不计。
请注意,这使用了ES5方法,这些方法很容易调整(我知道这个词)
答案 1 :(得分:3)
这是我的解决方案:
var words = [ 'rat', 'cat', 'dog', '[1-9]' ];
var texts = [ ... ];
// normalise (and compile) the regexps just once
var regex = words.map(function(w) {
return new RegExp('\\b' + w + '\\b', 'i');
});
// nested .filter calls, removes any word that is
// found in the regex list
texts = texts.filter(function(t) {
return regex.filter(function(re) {
return re.test(t);
}).length === 0;
});
答案 2 :(得分:1)
你显然必须按元素处理文本数组elemnt。但是,您可以通过加入“|”
将正则表达式合并为一个正则表达式您显示的regexps数组实际上是简单的字符串。我会删除前导/尾随/字符,然后构建一个正则表达式。类似的东西:
function reduce (texts, re) {
re = new RegExp (re.join ('|'));
for (var r = [], t = texts.length; t--;)
!re.test (texts[t]) && r.unshift (texts[t]);
return r;
}
alert (reduce (['the dog is hiding', 'cat', 'human', '1'], ['rat', 'cat', 'dog', '[1-9]']))
请注意,如果您的re字符串包含RegExp特殊字符,例如。{[^ $ etc,您将需要在字符串中转义它们或在函数中处理它们。
参见jsfiddle:http://jsfiddle.net/jstoolsmith/D3uzW/
答案 3 :(得分:0)
只是一个想法,将正则表达式数组合并到一个新的正则表达式并将第二个数组合并为一个新字符串,每个值都用信号分割,例如@,#,然后使用正则表达式替换匹配部分。