var reg1 = /^1$/g;
var reg2 = /^1$/;
for (var i = 0; i < 10; i++) {
console.log(reg1.test('1')) // true false true false true false true false ...
console.log(/^1$/g.test('1')) // true true true true true true true ...
console.log(reg2.test('1')) // true true true true true true true ...
console.log(/^1$/.test('1')) // true true true true true true true ...
}
Pourquoi la sortie du premier console.log est-elle comme ça ?
Lorsque l'expression régulière est exécutée, le lastIndex de l'objet RegExp peut changer.
La méthodetest est utilisée pour détecter si une chaîne correspond à une certaine règle régulière. Tant que la chaîne contient du texte qui correspond à la règle régulière, la méthode renvoie vrai, sinon elle renvoie faux.
En fait, si l'expression régulière a un flag global (avec le paramètre g), la méthode de test est également affectée par l'attribut lastIndex de l'objet régulier, comme suit :
Cet impact sera analysé dans l'explication de la méthode exec.
La méthodeexec est utilisée pour détecter la correspondance d'une chaîne par rapport à une expression régulière si un texte correspondant est trouvé, elle renvoie un tableau de résultats, sinon elle renvoie null.
Syntaxe : exec(string)
Le tableau renvoyé par la méthodeexec contient deux attributs supplémentaires, index et input. Et le tableau a les caractéristiques suivantes :
.Le 0ème élément représente le texte capturé par l'expression régulière
Le 1er~n élément représente la 1~nième référence arrière, qui à son tour pointe vers le texte capturé dans le 1~nième groupe. Vous pouvez utiliser RegExp.$ + "Number 1~n" pour obtenir le texte dans le groupe. dans l'ordre
index représente la position initiale de la chaîne correspondante
input représente la chaîne en cours de récupération
Que l'expression régulière ait ou non le drapeau global "g", le comportement de exec est le même. Mais le comportement de l'objet d'expression régulière est quelque peu différent. Expliquons en détail comment est le comportement de l'objet d'expression régulière. différent.
Supposons que l'objet d'expression régulière est reg, que le caractère détecté est une chaîne et que la valeur de retour de reg.exec(string) est un tableau.
Si reg contient la marque globale "g", alors l'attribut reg.lastIndex représente la position après la fin de la chaîne correspondante dans la chaîne d'origine, c'est-à-dire la position où commence la prochaine correspondance à ce moment, reg.lastIndex. == array.index (correspond à la position de départ) + array[0].length (correspondant à la longueur de la chaîne comme suit :
).Au fur et à mesure de la récupération, la valeur de array.index sera incrémentée, c'est-à-dire que la valeur de reg.lastIndex sera également incrémentée de manière synchrone. Par conséquent, nous pouvons également parcourir toutes les correspondances de la chaîne en appelant à plusieurs reprises la méthode exec. Texte. Jusqu'à ce que la méthode exec ne corresponde plus au texte, elle renverra null et réinitialisera la propriété reg.lastIndex à 0.
En suivant l'exemple ci-dessus, nous continuons à exécuter le code pour voir si ce qui précède est correct, comme indiqué ci-dessous :
Dans le code ci-dessus, comme la méthode exec est appelée à plusieurs reprises, la propriété reg.lastIndex est finalement réinitialisée à 0.
Examen des problèmes
Dans l'explication de la méthode de test, nous avons laissé un problème. Si l'expression régulière a le drapeau global g, le résultat de l'exécution de la méthode de test ci-dessus sera affecté par reg.lastIndex. De plus, la méthode exec est également la méthode de test. idem. Depuis reg.lastIndex La valeur n'est pas toujours nulle et elle détermine la position de départ de la prochaine correspondance. Si vous souhaitez commencer à récupérer une nouvelle chaîne après avoir terminé une correspondance dans une chaîne, vous devez réinitialiser manuellement l'attribut lastIndex. 0. Évitez les erreurs suivantes :
Le résultat d'exécution correct du code ci-dessus doit être "123456", il est donc recommandé d'ajouter "reg.lastIndex = 0;" avant d'exécuter la méthode exec pour la deuxième fois.
Si reg ne contient pas l'indicateur global "g", alors le résultat de l'exécution (tableau) de la méthode exec sera exactement le même que le résultat de l'exécution de la méthode string.match(reg).
Cet extrait provient du manuel d'utilisation du Front-End d'expression régulière | blog Louis. S'il vous a été utile, veuillez lui donner un like~
.