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'));
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);
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!