Maison > interface Web > js tutoriel > Pourquoi « RegExp » avec des indicateurs globaux et insensibles à la casse renvoie-t-il des résultats inattendus ?

Pourquoi « RegExp » avec des indicateurs globaux et insensibles à la casse renvoie-t-il des résultats inattendus ?

DDD
Libérer: 2024-12-21 05:51:10
original
270 Les gens l'ont consulté

Why Does `RegExp` with Global and Case-Insensitive Flags Return Unexpected Results?

Confusion Global RegExp

Le drapeau global (g) dans une expression régulière est conçu pour rechercher toutes les occurrences du modèle dans une chaîne , par opposition au premier. Cependant, lorsqu'il est utilisé avec l'indicateur insensible à la casse (i), il peut ne pas donner les résultats attendus.

Le problème

Considérez le scénario 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

La raison

Le problème se pose parce que l'indicateur global amène les objets RegExp à suivre le dernier index où une correspondance s'est produite. Dans les correspondances suivantes, la recherche commence à partir de cet index au lieu de 0. C'est ce qui se passe dans l'exemple ci-dessus :

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
Copier après la connexion

Comme vous pouvez le voir, la deuxième correspondance a donné "false" car la recherche a commencé à partir de index 6, où la correspondance s'est déjà produite lors du premier test.

Résoudre le problème

Pour éviter ce problème, vous peut réinitialiser la propriété lastIndex de l'objet RegExp entre les correspondances :

var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
re.lastIndex = 0;  // Reset the last index
result.push(re.test('Foo Bar'));
// result will be [true, true]
Copier après la connexion

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