7

2 つの配列があるとします。1 つは正規表現で、もう 1 つは入力です。では、パフォーマンスと可読性の観点から、出力のようなことを行うための最良の方法は何ですか?

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

単なるアイデアです。正規表現配列を新しい正規表現に結合し、2 番目の配列を新しい文字列に結合します。すべての値は @ 、# などのシグナルで分割され、正規表現を使用して一致部分を置き換えます。

于 2012-10-28T08:00:25.513 に答える