2013-05-13 49 views
0

看了這裏之後,我想出了一個模式來測試字符串的單詞數組。Javascript動態正則表達式

$.each(data, function(index, val) { 
    var pattern = new RegExp('?:^|\s'+ val + '?=\s|$', 'g'); 
    console.log(pattern.test(comment)); 
    if (!pattern.test(comment)) {       
      yay = true; 
     } 
}); 

這裏的問題是它始終返回true。有什麼建議麼?謝謝!

+1

您的模式有三個較小的模式,由'|'(或)分隔,所以如果任何較小的模式匹配 - 這將是真的 - 我想任何字符串都會匹配最後一部分。爲什麼你的模式以'?:'開頭? – nnnnnn 2013-05-13 21:26:55

+5

您錯過了非捕獲組和預見的括號。 – elclanrs 2013-05-13 21:26:56

+2

您還應該檢查控制檯中正則表達式的最終字符串表示形式,以便更好地進行調試。 – Bart 2013-05-13 21:28:03

回答

0

從你的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。

+0

感謝它的作品完美謝謝! – LouieV 2013-05-14 20:07:09

1

修復此行:

var pattern = new RegExp('(?:^|\s)'+ val + '(?=\s|$)', 'g'); 

您也可能會發現它有用的調試/使用這個在線工具驗證您的正則表達式:

http://gskinner.com/RegExr/

您將需要更換您val變量一個樣本值,而不是爲了調試。

+4

似乎還有一些括號丟失仍然... – elclanrs 2013-05-13 21:31:26