2014-10-29 40 views
0

在網站上,用戶在搜索框中輸入一些文本,例如字母「o」。Javascript RegExp無法通過簡單輸入

這將在該網站的JavaScript代碼以下正則表達式:在我遍歷一些字符串

var filterSubstring = $("#FilterOnSubstringBox").val(); 
var regexp = new RegExp(filterSubstring,"gi"); 

後來,和測試它們對正則表達式。我想測試對大小寫insenstive,所以這兩個「O」和「O」應符合:

for(var i = 0; i < array.length; i++) 
{ 
    var textToSearch = array[i].name; 

    if(!regexp.test(textToSearch)) 
    { 
     alert("NOT OK: " + textToSearch + " DID NOT CONTAIN: " + filterSubstring); 
    } 
    else 
    { 
     alert("OK! " + textToSearch + " CONTAINS: " + filterSubstring); 
    } 
} 

不幸的是,我得到以下奇怪的結果。我做了一個jsfiddle(http://jsfiddle.net/grs9xpek/)來展示這一點。

當在字母 'O' 過濾:

OK!: ontwerpbesluitenbundel.dmt CONTAINS: o 
OK!: ontwerpbesluitenbundel_body.xta CONTAINS: o 
NOT OK: ScriptTemplate.docx DID NOT CONTAIN: o 
OK!: ShippingOrder.xta CONTAINS: o 
NOT OK: header.xta DID NOT CONTAIN: o 

- > scriptTemplate.docx是錯誤的。

在字 'ONT'

OK!: ontwerpbesluitenbundel.dmt CONTAINS: ont 
NOT OK: ontwerpbesluitenbundel_body.xta DID NOT CONTAIN: ont 
NOT OK: ScriptTemplate.docx DID NOT CONTAIN: ont 
NOT OK: ShippingOrder.xta CONTAINS: ont 
NOT OK: header.xta DID NOT CONTAIN: ont 

過濾時 - > ontwerpbesluitenbundel_body.xta是錯誤的。

爲什麼這些名稱失敗的正則表達式?

+0

您能創建一個小提琴嗎? – 2014-10-29 11:57:23

+0

@ k-nut:完成了,現在更奇怪了...... – user1884155 2014-10-29 12:12:32

+0

所以......你正試圖查看輸入的字符串是否在任何'filterarray'字符串內部有特徵? – 2014-10-29 12:33:05

回答

5

在全局模式下,test方法從lastIndex開始,即使在使用不同的字符串時,該方法也會更新並且不會重置。手動將其重置爲0應該可以解決問題:

... 
    regexp.lastIndex = 0 
    if(!regexp.test(textToSearch)) 
    ... 
+0

你能給我一個手冊或參考詳細說明這種行爲? Google不是我的朋友,因此找到了這個源代碼。謝謝 – user1884155 2014-10-29 13:55:35

+0

ECMAScript規範(http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.6.2)的第15.10.6.2和15.10.6.3節詳細說明了順便說一下,不知道它只適用於全局模式。我將這添加到答案中。 – bwt 2014-10-30 10:58:14

+0

在這種情況下,「全球」意味着什麼?在我的jsFiddle中,爲什麼regexp是全局的或者不是全局的,你能舉一個例子說明它是(或者不是)? – user1884155 2014-10-30 14:01:05