Quel est le problème avec cette expression régulière lorsque j'utilise l'indicateur global et l'indicateur insensible à la casse? La requête est une entrée générée par l'utilisateur. Le résultat devrait être [vrai, vrai].
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]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
javascript
regex
à propos
la source
la source
re
.Réponses:
L'
RegExp
objet garde une trace de l'lastIndex
endroit où une correspondance s'est produite, donc lors des correspondances suivantes, il commencera à partir du dernier index utilisé, au lieu de 0. Regardez:Si vous ne souhaitez pas réinitialiser manuellement
lastIndex
à 0 après chaque test, supprimez simplement l'g
indicateur.Voici l'algorithme que les spécifications dictent (section 15.10.6.2):
la source
lastIndex
est dans les étapes 5, 6 et 11. Votre déclaration d'ouverture n'est vraie que SI LE DRAPEAU MONDIAL EST DÉFINI.Vous utilisez un seul
RegExp
objet et vous l'exécutez plusieurs fois. À chaque exécution successive, il continue à partir du dernier index de correspondance.Vous devez "réinitialiser" l'expression régulière pour recommencer depuis le début avant chaque exécution:
Cela dit, il peut être plus lisible de créer un nouvel objet RegExp à chaque fois (la surcharge est minime car le RegExp est de toute façon mis en cache):
la source
g
drapeau.RegExp.prototype.test
met à jour lalastIndex
propriété des expressions régulières afin que chaque test commence là où le dernier s'est arrêté. Je suggère d'utiliserString.prototype.match
car il ne met pas à jour lalastIndex
propriété:Remarque: le
!!
convertit en booléen, puis inverse le booléen pour qu'il reflète le résultat.Alternativement, vous pouvez simplement réinitialiser la
lastIndex
propriété:la source
La suppression du
g
drapeau global résoudra votre problème.Devrait être
la source
L'utilisation de l'indicateur / g lui indique de poursuivre la recherche après un coup.
Si la correspondance réussit, la méthode exec () renvoie un tableau et met à jour les propriétés de l'objet d'expression régulière.
Avant votre première recherche:
Après la première recherche
Supprimez le g et il quitte la recherche après chaque appel à exec ().
la source
exec
.Vous devez définir re.lastIndex = 0 car avec le drapeau g, regex garde la trace de la dernière correspondance, donc le test n'ira pas pour tester la même chaîne, pour cela vous devez faire re.lastIndex = 0
la source
J'avais la fonction:
Le premier appel fonctionne. Le deuxième appel ne fonctionne pas. L'
slice
opération se plaint d'une valeur nulle. Je suppose que c'est à cause dure.lastIndex
. C'est étrange car je m'attendrais à ce qu'un nouveauRegExp
soit alloué chaque fois que la fonction est appelée et non partagée entre plusieurs invocations de ma fonction.Quand je l'ai changé en:
Ensuite, je ne reçois pas l'
lastIndex
effet de maintien. Cela fonctionne comme je m'y attendais.la source