2011-07-31 6 views
12

Le Prob: Je reçois une réponse AJAX JSON (ou texte brut dans les sauts de ligne). Chaque élément de la réponse doit être vérifié via RegEx pour savoir s'il correspond ou non au motif défini par l'utilisateur.JavaScript retourne RegExp.test() faux, même si elle doit retourner vrai

Exemple:

Ajax Réponse (-texte clair)

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

utilisateur modèle:

/^Alg/ig.test(responseItem) 

Résultats RegExp devrait ressembler à:

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

Mais chaque le temps je me différencie des résultats (par exemple, un peu). (/^alg/ig.test("Algo") =>faux)

Mon code:

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] 
      ); 
     } 
    }); 
}) 

Console SORTIE:

/^Alg/ig => doit correspondre à chaque élément qui commence par Alg

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

/^Al/ig => doit correspondre à chaque élément parce que chaque élément commence par

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 

Toutes les suggestions?

+1

L'exécution de '/ ^alg/ig.test (" Algo ")' vous donne littéralement 'false'? – pimvdb

+0

P.S. Le point de l'ensemble est que je ne veux pas seulement faire correspondre les éléments de la réponse, mais aussi être en mesure de les collecter. –

+0

@pimvdb, no. '/ ^alg/ig.test (" Algo ")' renvoie vrai –

Répondre

22

Il s'agit d'un comportement courant que les méthodes exec ou test affichent lorsque vous traitez des modèles portant l'indicateur g global.

L'objet RegExp gardera une trace du lastIndex où une correspondance a été trouvée, puis le match suivant, il va commencer à partir de ce lastIndex au lieu de partir de 0.

Par exemple:

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

Retirez le drapeau g de votre modèle, puisque vous cherchez juste pour une seule (vous testez chaque ligne séparément).

1

essayer cette ~

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

il était l'espace blanc qui n'a pas été apparier:

essayez ceci:

$(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] 
     ); 
    } 
}); 

})

ici est jsFiddle:

http://jsfiddle.net/9Gqw2/

+0

Il semble avoir le même bizarre-prob que mon script. Je viens de tester votre version pour obtenir le même résultat .... –

3

Vous devez supprimer le drapeau global "g".

Questions connexes