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
766 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!

source:php.cn
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