Maison > interface Web > js tutoriel > Pourquoi un indicateur global dans RegExp produit-il des résultats inattendus avec plusieurs tests ?

Pourquoi un indicateur global dans RegExp produit-il des résultats inattendus avec plusieurs tests ?

Barbara Streisand
Libérer: 2024-12-23 14:31:10
original
562 Les gens l'ont consulté

Why Does a Global Flag in RegExp Produce Unexpected Results with Multiple Tests?

Pourquoi le drapeau global peut produire des résultats RegExp inattendus

Les expressions régulières (RegExps) avec le drapeau global (g) sont généralement utilisées pour trouver plusieurs occurrences d'un modèle dans une chaîne. Cependant, l'utilisation de cet indicateur avec l'indicateur insensible à la casse (i) peut conduire à des résultats inattendus.

Considérez l'exemple 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]
Copier après la connexion

Dans ce scénario, la méthode de test renvoie uniquement vrai dans la première itération. Pour comprendre ce comportement, nous devons considérer le fonctionnement de l'indicateur g.

Suivi du dernier index avec l'indicateur g

Lorsqu'il est utilisé avec l'indicateur g, un objet RegExp garde la trace du dernier index où un match a eu lieu. Lors des correspondances suivantes, RegExp commencera la recherche à partir de ce dernier index au lieu de 0.

Illustre ce concept :

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

console.log(re.test('Foo Bar')); // Matches at index 0
console.log(re.lastIndex); // Updated to 6

console.log(re.test('Foo Bar')); // No match, lastIndex is still 6
console.log(re.lastIndex); // Remains at 6
Copier après la connexion

Dans cet exemple, même si la chaîne Foo Bar contient une autre correspondance, le deuxième appel test renvoie false car RegExp a déjà déplacé sa position de recherche au-delà de la correspondance.

Par conséquent, l'utilisation du drapeau g en conjonction avec le drapeau i peut entraîner des correspondances manquées si la chaîne de recherche contient plusieurs instances du modèle avec une casse variable. Pour éviter cela, envisagez d'utiliser le drapeau i sans le drapeau g ou d'utiliser un seul appel test avec le drapeau g pour trouver uniquement la première correspondance.

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