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
DDDoriginal
2024-12-21 05:51:10220parcourir

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]

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

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]

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