Maison > interface Web > js tutoriel > Pourquoi la méthode `test()` d'une expression régulière globale renvoie-t-elle des résultats inattendus ?

Pourquoi la méthode `test()` d'une expression régulière globale renvoie-t-elle des résultats inattendus ?

Patricia Arquette
Libérer: 2024-12-21 12:26:10
original
779 Les gens l'ont consulté

Why Does a Global Regexp's `test()` Method Return Unexpected Results?

Résultats erronés de Regexp avec Global Flag

Dans le code fourni, l'expression régulière new RegExp(query, 'gi') est utilisée avec les indicateurs g (global) et i (insensible à la casse). Cependant, le résultat est inattendu : [vrai, faux].

Comprendre le drapeau global

Le drapeau g dans un objet RegExp contrôle le comportement du test() méthode. Lorsqu'il est défini, test() recherche le modèle dans la chaîne à plusieurs reprises, en commençant à l'endroit où la correspondance précédente s'est terminée. C'est ce qu'on appelle la « viscosité ».

Explication du résultat incorrect

Dans l'exemple, le premier appel à re.test('Foo Bar') trouve la correspondance " Fou B." Puisque l'indicateur g est défini, lastIndex est mis à jour à la position après "Foo B". Cela signifie que l'appel suivant à re.test('Foo Bar') commence la recherche à partir de la position après "Foo B". Aucune correspondance n'est trouvée, ce qui conduit au résultat faux.

Exemple avec Sticky Flag

Considérez le code suivant :

var reg = /^a$/g;
for(i = 0; i++ < 10;)
   console.log(reg.test("a"));
Copier après la connexion

Ce code s'imprime "vrai" 10 fois. Puisque reg a le drapeau g, il s'en tient au dernier match, testant à plusieurs reprises "a" depuis la position après le match précédent jusqu'à la fin de la chaîne.

Solution

Pour corriger le code d'origine, réinitialisez re.lastIndex à 0 avant chaque appel test() :

var query = 'Foo B';
var re = new RegExp(query, 'gi');
result.push(re.test('Foo Bar'));
re.lastIndex = 0;
result.push(re.test('Foo Bar'));
Copier après la connexion

Cela garantit que la recherche commence au début du chaîne pour chaque appel test(), donnant le résultat correct de [true, true].

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal