2011-07-31 63 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”。

相关问题