從你的JsFiddle中,我分叉並創建了我自己的一個,並且你的解決方案(用我的正則表達式從註釋中)works quite well,一旦所有小錯別字都清除了。但是,它可能很多,很多cleaner and faster。下面是我所做的是不同的:
$('#send-btn').on('click',function(){
$('#error').hide();
var pattern = new RegExp('\\b(' + list.join('|') + ')\\b', 'i');
var comment = $('#comment').val();
if(pattern.test(comment)){
$('#error').show();
};
});
具體來說,我產生的格局基本優勢JavaScript的Array.join
(JavaScript的內置),它粘貼一個字符串數組與規定的間隙串起來。這會生成一個字符串,其中包含由正則表達式交流器附加的所有搜索詞(|
)。然後通過用圓括號圍住該組以包含交替,我可以將邊界正則表達式(\b
)應用於任一端以確保我們只匹配整個單詞。其他消息:如果您只是進行簡單的測試,您確實不需要g
(全局)修飾符。您可能在其他應用程序中需要它 - 例如,如果您想突出顯示違規詞 - 但爲此我放棄了它。你應該使用i
修飾符來區分不區分大小寫的行爲。
這個最大的好處是,如果你願意,你可以選擇在這個函數之外定義你的正則表達式,你會看到相當顯着的速度增益。
缺點:收益遞減,因爲你犯規的單詞越長越好。但給予this benchmark,你的方式會好一段時間(很長一段時間)。
注意
你應該知道,你應該在正則表達式中使用之前,他們逃離你的話 - 在您的列表,比如「a.s.s」將匹配「alsls」。雖然是亂碼,但這不是一個真正的發誓詞,你可以很容易地看出這樣的問題如何能夠外推到找不到褻瀆的地方。但是,您可以選擇在函數外部執行此操作,甚至可以利用字詞定義中正則表達式的強大功能(定義'[a @] [$ s] {2}'而不是'ass','@ss', 'a $ s','as $','@ $ s','@ s $','a $$'和'@ $$'),所以我不打算在這裏說明。
祝你好運,快樂的regexing。
您的模式有三個較小的模式,由'|'(或)分隔,所以如果任何較小的模式匹配 - 這將是真的 - 我想任何字符串都會匹配最後一部分。爲什麼你的模式以'?:'開頭? – nnnnnn 2013-05-13 21:26:55
您錯過了非捕獲組和預見的括號。 – elclanrs 2013-05-13 21:26:56
您還應該檢查控制檯中正則表達式的最終字符串表示形式,以便更好地進行調試。 – Bart 2013-05-13 21:28:03