2010-05-11 11 views
3

ai funciton dans mon objet qui s'appelle régulièrement.javascript string exec comportement étrange

parse : function(html) 
{ 
    var regexp = /...some pattern.../ 
    var match = regexp.exec(html); 
    while (match != null) 
    { 
     ... 
     match = regexp.exec(html); 
    } 
    ... 
    var r = /...pattern.../g; 
    var m = r.exec(html); 
} 

avec html inchangées les m renvoie null chaque autre appel. disons

parse(html);// ok 
parse(html);// m is null!!! 
parse(html);// ok 
parse(html);// m is null!!! 
// ...and so on... 

est-il un indice ou somrthing qui doit être remis à zéro sur html ... Je suis vraiment confus. Pourquoi match renvoie toujours le résultat approprié?

Répondre

3

Ceci est un comportement courant lorsque vous manipulez des modèles portant l'indicateur g global et que vous utilisez les méthodes exec ou test.

Dans ce cas, 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.

Edit: En réponse à votre commentaire, pourquoi ne pas l'objet RegExp être recréé lorsque vous appelez à nouveau la fonction:

Ce comportement est décrit pour littéraux d'expression régulière, laissez-moi citer t il Spécification:

§ 7.8.5 - Regular Expression Literals

...

L'objet est créé avant l'évaluation du programme contenant ou la fonction commence. L'évaluation du littéral produit une référence à cet objet; il ne crée pas un nouvel objet.

....

Vous pouvez faire une simple preuve par:

function createRe() { 
    var re = /foo/g; 
    return re; 
} 

createRe() === createRe(); // true, it's the same object 

Vous pouvez être sûr que est le même objet, parce que « deux littéraux d'expression régulière dans un programme d'évaluer aux objets d'expression régulière qui ne se comparent jamais === entre eux, même si le contenu des deux littéraux est identique ", par exemple:

/foo/ === /foo/; // always false... 

Cependant, ce comportement est respecté sur tous les navigateurs mais pas par IE, ce qui initialise un nouvel objet RegExp à chaque fois.

+0

Oui, je me doutais de quelque chose comme ça, mais comment se fait-il que ces variables regex ne soient pas gc-ed et en cours de réinitialisation? Je crois que chaque fois que j'appelle parse() la nouvelle portée devrait être initialisée. – Pablo

+0

@Michael, jetez un oeil à mon edit ... – CMS

1

Pour éviter ce comportement car il pourrait être nécessaire dans ce cas, il suffit de régler

var r = /...pattern.../g; 
var m = r.exec(html); 
r.lastIndex=0; 

Cela a fonctionné pour moi.