Je crée un objet RegExp (en JavaScript) pour tester la présence d'un certain nombre:
console.log( test.test( '1' ) ); // true console.log( test.test( '0' ) ); // false - why? console.log( test.test( '1' ) ); // true console.log( test.test( '2' ) ); // false - why? console.log( test.test( '2' ) ); // true - correct, but why is this one true?
3 Réponses :
Supprimez le drapeau question similaire et réponse ici: Pourquoi regex JavaScript // g Drapeau affectant l'état? P> 'g' code>. Lorsque vous utilisez le drapeau 'g code>', il met à jour la propriété lastIndex code> de la REGEX (préparation de la recherche successive sur la même chaîne), puis commence la recherche suivante à partir de celle-ci. valeur d'index (vous donnant ainsi une fausse lecture sur votre prochaine recherche). P>
Voulez-vous dire qu'il ignore la chaîne d'entrée la deuxième fois que je l'appelle et continue de rechercher des correspondances dans la chaîne donnée précédemment? C'est assez bizarre
@ Dave. Il est la mise à jour lastIndex code> dans l'objet regex et à partir du deuxième match à partir de là que vous donne la fausse lecture.
Ah Ok, je pense que je comprends maintenant. J'ai mis un test rapide ensemble et il semble qu'il utilise la nouvelle chaîne, mais des recherches à partir du dernier index correspondant: Jsfiddle.net/ SNXSG Cela doit être le comportement le plus étrange jamais, mais au moins je comprends maintenant. Merci!
par documentation: https://developer.mozilla.org/ EN-US / DOCS / JavaScript / Référence / Global_Objects / Regexp / Test # Description
test code> appelé plusieurs fois sur la même instance d'expression régulière globale passeront après la correspondance précédente. P> blockquote>Vous pouvez confirmer ce comportement: p>
xxx pré> Il n'a pas de sens d'utiliser le drapeau
g code> si tout ce que vous voulez est de confirmer une seule correspondance contre diverses chaînes. p> p>
Merci. Vous étiez quelques minutes derrière jfriend00 mais cela semble être une réponse plus complète. Juste en attendant le compte à rebours expirer à accepter!
Selon MDN ,
comme avec
exec code> (ou en combinaison avec elle),test code> appelé plusieurs fois sur la même instance d'expression régulière globale passeront après la match précédent. p> blockQuote>techniquement, la spécification ECMAScript 5.1 dit P>
15.10.6.3 Regexp .pototype.test (string) strong> p> Les étapes suivantes sont prises: p>
- Laissez le match Soyez le résultat de l'évaluation de l'algorithme code> regexp.pototype.exec code> (15.10.6.2) sur cet objet REGEXP en utilisant string em> comme le argument. li>
- si match em> n'est pas null, puis retournez
vrai code>; sinon retournerfaux code>. li> ol>
15.10.6.2 Regexp .pototype.exec (chaîne) forte> p> Effectue une correspondance d'expression régulière de string em> contre le régulier expression et retourne un objet de tableau contenant les résultats de la Correspondre, ou
null code> si string em> ne correspond pas. p>La chaîne tostring ( chaîne em>) est recherchée par une occurrence de la Modèle d'expression régulier comme suit: p>
- Laissez r em> être cet objet Regexp. li>
- [...] li>
- [...] li>
- laisse lanceIndex em> résulte de l'appelant la méthode interne [[get]] de r em> avec argument "
lastIndex code>". LI >- laisse i em> la valeur de TOINTEGER ( LastDex em>). Li>
- laissez global em> résulte de l'appelant la méthode interne [[get]] de r em> avec argument "
global code>". li >- Si global em> est
faux code>, puis laisse i em> = 0. li>- [...] li>
- [...] li>
- laissez e em> être r em> 's endindex em> valeur. li>
- si global em> est
vrai code>,
- appelez la méthode interne [[Mettre]] de r em> avec des arguments "
lastIndex code>", e em> etvrai code>. li> ol> li>- [...] li> ol> blockQuote>
Par conséquent, pour éviter ce comportement, vous pouvez p>
Évitez d'utiliser un drapeau global
g code> p>De cette façon, à l'étape 7,
i code> sera0 code> au lieu delastIndex code>. p> li>réinitialiser
lastIndex code >manuellement après chaque utilisation p>La valeur de la propriété
lastIndex code> Spécifie la position de la chaîne à qui pour commencer la prochaine correspondance. P> blockQuote>Par exemple, P>
var test = /[0-9]/g; test.test('0'); // true test.lastIndex; // 1 '0'.search(test) > -1; // true test.lastIndex; // 1 (unaltered) !!'0'.match(test); // true test.lastIndex; // 0Utilisez
correspondant code> ouRecherche code> Méthodes de chaîne p>
correspondez code> réticentslastIndex code> à 0 etrecherche code> l'ignore: p>15.5.4.10 chaîne .pototype.Match (regexp) strong> p>
[...] [si] global em> est
vrai code>, appelez la méthode interne [[Mettre]] de rx em> avec des arguments "lastIndex code> "et 0. [...] p>15.5.4.12 String .pototype.Search (regexp) strong> p>
[...] Rechercher la valeur string em> à partir de son début pour une occurrence de la Modèle d'expression régulier rx em>. [...] le
lastIndex code> etglobal code> Les propriétés de Regexp em> sont ignorées lors de la recherche. [...] p> blockQuote>Par exemple, P>
var test = /[0-9]/g; test.test('0'); // true test.lastIndex; // 1 test.lastIndex = 0; test.test('1'); // true