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