2011-07-31 59 views
12

問題:我得到一個AJAX響應(帶有換行符的JSON或明文)。應通過RegEx檢查每個響應項目,以確定它是否與用戶定義的模式匹配。JavaScript RegExp.test()返回false,儘管它應該返回true

實施例:

Ajax響應(純文本)

"Aldor 
Aleph 
Algae 
Algo 
Algol 
Alma-0 
Alphard 
Altran" 

用戶模式:

/^Alg/ig.test(responseItem) 

正則表達式的結果應該是這樣的:

Aldor // false 
Aleph // false 
Algae // true 
Algo // true 
Algol // true 
Alma-0 // false 
Alphard // false 
Altran // false 

但是每時間我得到不同ent(和有點weired)結果...例如(/^alg/ig.test("Algo") =>

我的代碼:

HTML

... 
<form> 
    <input id="in" /> 
</form> 
<div id="x"> 
    Aldor 
    Aleph 
    Algae 
    Algo 
    Algol 
    Alma-0 
    Alphard 
    Altran 
</div><button id="checker">check!</button> 
... 

的JavaScript(jQuery的1.6.2)

$(function(){ 
    var $checker = $('#checker'); 

    $checker.click(function(ev){ 
     var inputFieldVal = $.trim($('#in').val()); 
     console.log(inputFieldVal); // Alg 
     var regExpPattern = '^'+inputFieldVal, 
      re = new RegExp(regExpPattern, 'igm'); 
     onsole.log(re); // /^Al/gim 
     // Get text out of div#x 
     var text = $('#x').text(); 
     // Trim and 'convert' to an array... 
      text = $.trim(text).split('\n'); 
     console.log(text); // ["Aldor", "Aleph", "Algae", "Algo", "Algol", "Alma-0", "Alphard", "Altran"] 

     for (var index=0, upper=text.length;index<upper;++index) { 
      console.log(
       re.test(text[index]), 
       text[index] 
      ); 
     } 
    }); 
}) 

控制檯輸出:

/^Alg/ig =>應與Alg

false "Aldor" 
false "Aleph" 
true "Algae" 
false "Algo" //Why ? O.o 
true "Algol" 
false "Alma-0" 
false "Alphard" 
false "Altran" 

/^Al/ig開始每個項目匹配=>應該匹配每一個項目,因爲每個項目開始

true "Aldor" 
false "Aleph" //Why ? O.o 
true "Algae" 
false "Algo" //Why ? O.o 
true "Algol" 
false "Alma-0" //Why ? O.o 
true "Alphard" 
false "Altran" //Why ? O.o 

有什麼建議?

+1

執行'/^alg/ig.test(「Algo」)'字面上也會給你'false'嗎? – pimvdb

+0

P.S.總的來說,我想要的不僅僅是答案中的項目,還能夠收集它們。 –

+0

@pimvdb,no。 '/^alg/ig.test(「Algo」)'返回true –

回答

22

這是exec或test方法在處理具有全局g標誌的模式時顯示的常見行爲。

RegExp對象將跟蹤lastIndex那裏找到匹配的,然後在隨後的比賽它將從lastIndex開始,而不是從0開始。

例如:

var re = /^a/g; 
console.log(re.test("ab")); // true, lastIndex was 0 
console.log(re.test("ab")); // false, lastIndex was 1 

從模式中刪除g標誌,因爲您是一個匹配(你單獨測試每行)尋求公正。

1

試試這個〜

var str = "Aldor\rAleph\rAlgae\rAlgo\rAlgol"; 
var myregexp = /^alg.*$/img; 
var match = myregexp.exec(str); 
while (match != null) { 
    for (var i = 0; i < match.length; i++) { 
     alert(match[i]); 
    } 
    match = myregexp.exec(str); 
} 
0

有人認爲是不符合它的白色空間:

試試這個:

$(function(){ 
var $checker = $('#checker'); 

$checker.click(function(ev){ 
    var inputFieldVal = $.trim($('#in').val()); 
    console.log(inputFieldVal); // Alg 
    var regExpPattern = '^'+inputFieldVal, 
     re = new RegExp(regExpPattern, 'igm'); 
    console.log(re); // /^Al/gim 
    // Get text out of div#x 
    var text = $('#x').text(); 
    // Trim and 'convert' to an array... 
     text = $.trim(text).split('\n'); 
    console.log(text); // ["Aldor", "Aleph", "Algae", "Algo", "Algol", "Alma-0", "Alphard", "Altran"] 

    for (var index=0, upper=text.length;index<upper;++index) { 
     console.log(
      re.test(text[index].trim()), 
      text[index] 
     ); 
    } 
}); 

})

這裏的jsfiddle:

http://jsfiddle.net/9Gqw2/

+0

它似乎與我的腳本具有相同的奇怪概率。我剛剛測試你的版本,得到相同的結果.... –

3

您必須刪除全局標誌「g」。

相關問題