7

假设我有两个数组:一个是正则表达式,另一个是输入。那么,就性能和可读性而言,最好的方法是什么?

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]);
}

但是,这不是可读的吗?也许还有另一种我没有想到的方法。

4

4 回答 4

10

我可能会去这样的事情

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 方法,这些方法很容易调整(我编了一个我知道的词)

于 2012-10-28T07:53:20.540 回答
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;
});

http://jsfiddle.net/SPAKK/

于 2012-10-28T07:52:29.910 回答
1

您显然必须逐个处理文本数组元素。但是,您可以通过加入 '|' 将您的正则表达式组合成一个

您显示的正则表达式数组实际上是简单的字符串。我会删除前导和尾随 / 字符,然后构造一个正则表达式。就像是 :

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 特殊字符,如 .{[^$ 等,您将需要在字符串中转义它们或在函数中处理它们。

见 jsfiddle:http: //jsfiddle.net/jstoolsmith/D3uzW/

于 2012-10-28T07:52:12.137 回答
0

只是一个想法,将正则表达式数组组合成一个新的正则表达式并将第二个数组组合成一个新字符串,每个值都用一个信号分割,例如@,#,然后使用正则表达式替换匹配部分。

于 2012-10-28T08:00:25.513 回答