Maison > interface Web > js tutoriel > Pourquoi la combinaison des indicateurs « g » et « i » dans RegExp de JavaScript produit-elle des résultats inattendus ?

Pourquoi la combinaison des indicateurs « g » et « i » dans RegExp de JavaScript produit-elle des résultats inattendus ?

Susan Sarandon
Libérer: 2024-12-28 10:02:27
original
355 Les gens l'ont consulté

Why Does Combining the `g` and `i` Flags in JavaScript's RegExp Produce Unexpected Results?

RegExp : Le cas de la combinaison inattendue d'indicateurs

Lorsque vous travaillez avec des expressions régulières (RegEx), il est crucial de comprendre l'impact des différents indicateurs sur le comportement de correspondance. Un problème déroutant se pose lors de l'utilisation conjointe des indicateurs global (g) et insensible à la casse (i).

Le problème :

Considérez le code 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'));
Copier après la connexion

Résultat attendu : [vrai, vrai]

Résultat réel : [vrai, false]

L'explication :

L'indicateur g dans les objets RegEx permet la poursuite de la correspondance à partir du dernier index trouvé. Cela signifie qu'une fois la première correspondance trouvée, les tests suivants continueront la recherche à partir du caractère immédiatement après la correspondance précédente. Ce comportement peut conduire à des résultats inattendus lorsque les modèles impliquent plusieurs instances de la même sous-chaîne.

Dans notre exemple, la correspondance initiale se produit au premier caractère de « Foo Bar ». Cependant, le deuxième test (sans l'indicateur g) redémarre le processus de correspondance depuis le début de la chaîne, ce qui entraîne un résultat faux malgré la correspondance attendue à la prochaine instance de 'Foo'.

Résolution le problème :

Pour atténuer ce problème, envisagez d'utiliser la propriété lastIndex de l'objet RegEx pour contrôler manuellement l'index de départ de chaque test, comme indiqué dans ce qui suit exemple :

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex);

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);

re.lastIndex = 0;
console.log(re.test('Foo Bar'));
console.log(re.lastIndex);
Copier après la connexion

Cette approche permet un comportement de correspondance plus prévisible, garantissant que le modèle est évalué par rapport à la chaîne entière à chaque fois.

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