2012-10-28 30 views
6

假設我有兩個數組:一個是正則表達式,另一個是輸入數據。那麼,什麼是最好的方式 - 在性能和可讀性方面 - 做類似輸出的東西?我們如何過濾javascript中的正則表達式數組中的元素?

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

但是,是不是可讀?也許還有另一種我沒有想到的方式。

+1

看到這個在http://stackoverflow.com/questions/13107048/javascript-desconstrutioning-menu –

+1

@IamAndy這個問題是如何遠程相關的這一個? – Alnitak

回答

7

我可能會去像這樣

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的方法,這是很容易shimmable(我做了我所知道的單詞)

+0

很好的使用'.some' - 我已經忘記了那個。 – Alnitak

+0

感謝兄弟,我注意到大多數數組的功能可以通過不太常用的現有方法找到,或者更深入地使用它們。他們非常強大。道具ECMA男生 –

+0

是公平的,這些方法中的大多數都是功能性編程語言捏造的,其中操縱列表的函數是語言的核心。 – Alnitak

1

您顯然必須按元素處理文本數組elemnt。但是,您可以通過加入'|'來將您的正則表達式合併爲一個正則表達式

您顯示的正則表達式數組實際上是簡單的字符串。我會刪除前導和尾隨/字符,然後構造一個正則表達式。喜歡的東西:

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]'])) 

請注意,如果你重新字符串包含正則表達式特殊字符,如{[^ $等等,你需要逃避他們要麼在字符串或在函數處理它們。

見的jsfiddle:http://jsfiddle.net/jstoolsmith/D3uzW/

+0

這個答案也不能區分大小寫或尋找單詞邊界 – Alnitak

2

這裏是我的解決方案:

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/

0

只是一個想法,正則表達式陣列結合到一個新的正則表達式和第二陣列相結合,新的字符串,每個值都被一個信號分割,比如@,#,然後用正則表達式替換匹配部分。

相關問題