Maison >interface Web >js tutoriel >Pourquoi la méthode `test()` de RegExp renvoie-t-elle des résultats inattendus avec des indicateurs globaux et insensibles à la casse ?

Pourquoi la méthode `test()` de RegExp renvoie-t-elle des résultats inattendus avec des indicateurs globaux et insensibles à la casse ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 20:37:17295parcourir

Why Does RegExp's `test()` Method Return Unexpected Results with Global and Case-Insensitive Flags?

RegExp avec l'indicateur global et l'indicateur insensible à la casse donne des résultats inattendus

Question :

Lors de l'utilisation d'une expression régulière avec le l'indicateur global (g) et l'indicateur insensible à la casse (i), pourquoi la méthode de test produit-elle des résultats incorrects pour les erreurs générées par l'utilisateur ? entrée ?

Exemple :

Considérez le code suivant :

var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]

Résultat attendu : [vrai, vrai]

Explication :

Un objet RegExp avec le drapeau g maintient la propriété lastIndex, indiquant la position de la dernière correspondance. Lorsque la méthode de test est appelée à plusieurs reprises sans réinitialiser lastIndex, elle reprendra la recherche à partir du dernier index utilisé plutôt que de repartir de 0.

Démonstration :

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex); // 0

console.log(re.test('Foo Bar')); // true
console.log(re.lastIndex); // 6

console.log(re.test('Foo Bar')); // false
console.log(re.lastIndex); // 6

Dans l'exemple ci-dessus, le premier appel à test définit lastIndex sur 6. Par la suite, le deuxième appel reprend la recherche à partir de l'index 6, ce qui donne la valeur false car la portée de la recherche est limitée à l'index 6. personnages suite au dernier match.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn