Si je lance ceci:
/([^\/]+)+/g.exec('/a/b/c/d');
J'ai compris:
["a", "a"]
Mais si je lance ceci:
'/a/b/c/d'.match(/([^\/]+)+/g);
Ensuite, j'obtiens le résultat attendu de ceci:
["a", "b", "c", "d"]
Quelle est la différence?
javascript
regex
Justin Warkentin
la source
la source
exec
pour obtenir toutes les sous-sélections.+
n'est pas nécessaire carmatch
retournera déjà toutes les sous-expressions..exec
n'en renvoie qu'un à chaque fois, donc il n'en a pas besoin non+
plus.Réponses:
exec
avec une expression régulière globale est destiné à être utilisé dans une boucle, car il récupérera toujours toutes les sous-expressions correspondantes. Alors:String.match
fait cela pour vous et supprime les groupes capturés.la source
while(match = /[^\/]+/g.exec('/a/b/c/d')
ou cela créera une boucle infinie !. Comme il est clairement indiqué dans le MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…new RegExp("pattern")
et/pattern/
signifiait des choses différentes.Une image c'est mieux, tu sais ...
Regarde la différence?
la source
/regex/.exec()
renvoie uniquement la première correspondance trouvée, tandis que les"string".match()
renvoie toutes si vous utilisez l'g
indicateur dans l'expression régulière.Voir ici: exec , match .
la source
Si votre expression régulière est globale et que vous effectuez une capture, vous devez utiliser exec. Match ne renverra pas toutes vos captures.
Match fonctionne très bien pour la correspondance (pas la capture). Vous l'exécutez une fois et il donne un tableau de toutes les correspondances. (bien que si l'expression régulière n'est pas globale, la correspondance affichera la correspondance suivie de captures)
Exec est ce que vous utilisez lorsque vous capturez, et chaque fois qu'il est exécuté, il donne la correspondance, suivie des captures. (la correspondance se comportera de manière à donner la correspondance complète suivie de captures, uniquement lorsque l'expression régulière n'est pas globale).
Une autre utilisation avec Exec consiste à obtenir l'index ou la position d'une correspondance. Lorsque vous avez une variable pour votre regex, vous pouvez utiliser .lastIndex et obtenir la position de la correspondance. Un objet regex a .lastIndex, et l'objet regex est ce que vous faites .exec. La correspondance de point est effectuée sur une chaîne et vous ne pourrez pas faire l'objet regex dot lastIndex
Une chaîne, a la fonction de correspondance, qui reçoit une expression régulière. Et une expression régulière, a la fonction exec, et reçoit une chaîne
exec vous exécutez plusieurs fois. match vous courez une fois
Il est bon d'utiliser match lorsque vous ne capturez pas et lors de la capture, vous pouvez utiliser exec qui est plus puissant car il est bon pour obtenir des captures, mais si vous avez utilisé match lors de la capture, voyez qu'il affiche les captures lorsque l'expression régulière n'est pas globale, mais ne le fait pas 't show capture lorsque le regex est global.
Une autre chose est que si vous utilisez exec, notez qu'il est appelé sur l'expression régulière, alors si vous avez utilisé une variable pour l'expression régulière, vous avez plus de puissance
Vous n'obtenez pas les correspondances lorsque vous n'utilisez pas la variable pour l'expression régulière, utilisez donc la variable pour l'expression régulière, lorsque vous utilisez exec
Et avec exec, vous pouvez obtenir l '"index" du match
Donc, si vous voulez des index ou capturer, alors utilisez exec (gardez à l'esprit que comme vous pouvez le voir, avec le "index", le "index" qu'il donne est vraiment une nième occurrence, il compte à partir de 1. Donc vous pouvez dériver le bon index en soustrayant 1. Et comme vous pouvez le voir, il donne 0 - lastIndex de 0 - pour non trouvé).
Et si vous voulez étirer la correspondance, vous pouvez l'utiliser lorsque vous capturez, mais pas lorsque l'expression régulière est globale, et lorsque vous le faites pour cela, alors le contenu du tableau ne correspond pas à toutes les correspondances, mais est complet match suivi des captures.
la source
r.lastIndex
est le facteur clé pour comprendre la différence entreexec
etmatch
.If your regex is global, and you are capturing, then you must use exec. Match won't return all your captures.
je l'ai sur la console. Copiez / collez simplement"a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
Ce qui se passe là-bas, c'est qu'il montre toutes les correspondances, et il se trouve que vous avez capturé chaque match, donc s'il montrait toutes les captures, il aurait exactement la même apparence (cntd)Le .match () fonction
str.match(regexp)
va effectuer les opérations suivantes:g
drapeau est utilisé dans l'expression rationnelle: il retournera toutes les sous-chaînes (en ignorant les groupes de capture)g
indicateur n'est pas utilisé dans l'expression rationnelle: il retournera le même queregexp.exec(str)
null
Exemples de .match () utilisant l'
g
indicateur:Et .match () sans l'
g
indicateur équivaut à .exec () :Le .exec () fonction
regexp.exec(str)
va effectuer les opérations suivantes:g
drapeau est utilisé dans l'expression rationnelle: il retournera (à chaque fois qu'il est appelé) :[N_MatchedStr, N_Captured1, N_Captured2, ...]
de la prochaineN
correspondance. Important: il ne passera pas à la prochaine correspondance si l'objet regexp n'est pas stocké dans une variable (il doit être le même objet)g
drapeau n'est pas utilisé dans l'expression rationnelle: il retournera le même que s'il avait ung
drapeau et a été appelé pour la première fois et une seule fois.null
Exemple de .exec () (expression rationnelle stockée + en utilisant le
g
drapeau = cela change à chaque appel):Exemples de .exec () quand il ne change pas à chaque appel:
la source
Parfois, regex.exec () prendra beaucoup plus de temps que string.match ().
Il convient de mentionner que si le résultat de string.match () et regex.exec () est le même (ex: si vous n'utilisez pas le drapeau \ g), regex.exec () prendra quelque part entre x2 et x30 puis string. rencontre():
Par conséquent, dans de tels cas, l'utilisation de l'approche de "new RegExp (). Exec ()" ne doit être utilisée que lorsque vous avez besoin d'une expression régulière globale (c'est-à-dire pour s'exécuter plus d'une fois).
la source