Résultats erronés de Regexp avec Global Flag
Dans le code fourni, l'expression régulière new RegExp(query, 'gi') est utilisée avec les indicateurs g (global) et i (insensible à la casse). Cependant, le résultat est inattendu : [vrai, faux].
Comprendre le drapeau global
Le drapeau g dans un objet RegExp contrôle le comportement du test() méthode. Lorsqu'il est défini, test() recherche le modèle dans la chaîne à plusieurs reprises, en commençant à l'endroit où la correspondance précédente s'est terminée. C'est ce qu'on appelle la « viscosité ».
Explication du résultat incorrect
Dans l'exemple, le premier appel à re.test('Foo Bar') trouve la correspondance " Fou B." Puisque l'indicateur g est défini, lastIndex est mis à jour à la position après "Foo B". Cela signifie que l'appel suivant à re.test('Foo Bar') commence la recherche à partir de la position après "Foo B". Aucune correspondance n'est trouvée, ce qui conduit au résultat faux.
Exemple avec Sticky Flag
Considérez le code suivant :
var reg = /^a$/g; for(i = 0; i++ < 10;) console.log(reg.test("a"));
Ce code s'imprime "vrai" 10 fois. Puisque reg a le drapeau g, il s'en tient au dernier match, testant à plusieurs reprises "a" depuis la position après le match précédent jusqu'à la fin de la chaîne.
Solution
Pour corriger le code d'origine, réinitialisez re.lastIndex à 0 avant chaque appel test() :
var query = 'Foo B'; var re = new RegExp(query, 'gi'); result.push(re.test('Foo Bar')); re.lastIndex = 0; result.push(re.test('Foo Bar'));
Cela garantit que la recherche commence au début du chaîne pour chaque appel test(), donnant le résultat correct de [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!