Quelle est la différence entre les RegExp de la fonction exec() et de la Chaîne de fonction match ()?
Si je l'exécute:
/([^\/]+)+/g.exec('/a/b/c/d');
J'obtiens ceci:
["a", "a"]
Mais si je l'exécute:
'/a/b/c/d'.match(/([^\/]+)+/g);
Puis-je obtenir le résultat attendu de cette:
["a", "b", "c", "d"]
Quelle est la différence?
- vous boucle avec
exec
pour obtenir tous les sous-sélections. - Notez que le deuxième
+
n'est pas nécessaire, carmatch
sera de retour tous les sous-expressions déjà..exec
retourne seulement un à chaque fois, donc il n'a pas besoin que+
soit. - En plus de cela, imbriqués les quantificateurs comme les deux points positifs doivent être utilisés avec prudence, car ils facilement conduire à catastrophique mandature.
- Merci pour le lien. Que m'inciter à en apprendre sur les quantificateurs possessifs et atomique de regroupement. De très belles choses à comprendre.
Vous devez vous connecter pour publier un commentaire.
exec
avec une expression régulière est destinée à être utilisée dans une boucle, comme il le fera toujours récupérer tous appariés sous-expressions. Donc:String.match
fait cela pour vous et supprime la phase de groupes.while(match = /[^\/]+/g.exec('/a/b/c/d')
ou il va créer une boucle infinie!. Comme il est clairement indiqué dans le MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Une image est mieux, tu sais...
JS:
Voir la différence?
/regex/.exec()
retourne uniquement la première correspondance trouvée, alors que"string".match()
retourne tous si vous utilisez leg
drapeau dans la regex.Voir ici: exec, match.
Si votre regex est mondial, et vous êtes à la capture, puis vous devez utiliser exec. Le Match ne sera pas de retour toutes vos captures.
Match fonctionne quand même juste de correspondance(pas de capture). Vous exécutez une fois et il donne un tableau de tous les matchs. (bien que, si la regex n'est pas globale, puis le match s'affichera le match suivi par capture)
Exec est ce que vous utilisez lorsque vous capturez, et à chaque fois qu'il est exécuté, il donne le match, suivi par la capture. (match va se comporter d'une manière de donner match suivi par capture, uniquement lorsque la regex n'est pas global).
Une autre utilisation avec Exec, est d'arriver à l'index ou à la position d'un match. Lorsque vous avez une variable pour votre regex, vous pouvez utiliser .lastIndex et obtenir la position de la correspondance. Une regex objet .lastIndex, et l'objet regex est ce que vous faites .exec sur. Dot match est terminé sur une chaîne, vous ne serez pas en mesure de faire objet regex dot lastIndex
Une chaîne, a la fonction de match, qui est passé d'une expression régulière. Et une regex, a la fonction exec, et est passée à une chaîne de
exec vous exécutez plusieurs fois. match vous exécutez une fois
C'est bien d'utiliser de match, pas de capture et lors de la capture, vous pouvez utiliser exec qui est plus puissant qu'il est bon pour obtenir des captures, mais si vous n'avez que l'utilisation lors de la capture, de voir qu'il montre la capture lors de la regex n'est pas globale, mais ne montre pas de capture lors de la regex est mondiale.
Une autre chose est que si vous utiliser exec, note appelée sur les regex, alors si vous avez utilisé une variable pour la regex, vous avez plus de puissance
Vous n'obtenez pas les matchs lorsque vous n'utilisez pas la variable pour la regex, il faut donc utiliser la variable pour la regex, lors de l'utilisation de exec
Et avec exec, vous pouvez obtenir l ' "indice" de la correspondance
Donc, si vous voulez d'index ou de la capture, puis utiliser exec (gardez à l'esprit que, comme vous pouvez le voir, avec l ' "indice", l ' "indice" il donne, c'est vraiment un n-ième occurrence, c'est à compter à partir de 1. Donc, vous pourriez tirer le bon indice en soustrayant 1. Et comme vous pouvez le voir, il donne 0 - lastIndex de 0 - pour ne pas trouvé).
Et si vous voulez étirer match, vous pouvez l'utiliser lorsque vous êtes à la capture, mais pas quand la regex est mondial, et lorsque vous le faites pour que, ensuite, le contenu de la matrice ne sont pas tous les matchs, mais la correspondance complète suivie par la capture.
r.lastIndex
est le facteur clé pour comprendre la différence entreexec
etmatch
."a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
Ce qui s'y passe est-il montre tous les matchs, et il se trouve que vous avez capturées chaque match, donc si c'était pour montrer toutes les captures, il devrait ressembler exactement le même(cntd)"abc".match(/a(.)c/g)
avec"abc".match(/(.)/g)
Dans lea(.)c
cas, vous voyez qu'il n'a pas montré précisément ce que\1
est,il a juste montré le matcha(.)c
qui est le matcha.c
"a,b,c,aa,bb,cc".match(/(\w+),/g);
est mal["a,", "b,", "c,", "aa,", "bb,"]
devrait être["a", "b", "c", "aa", "bb", "cc"]
. Vous êtes de droite.La .match() fonction
str.match(regexp)
va faire ce qui suit:g
drapeau est utilisé dans la regexp: il sera de retour tous les sous-chaînes (en ignorant les groupes de capture)g
drapeau est pas utilisé dans la regexp: il sera de retour le même queregexp.exec(str)
null
Exemples de .match() à l'aide de la
g
drapeau:Et .match() sans
g
drapeau est équivalent à .exec():La .exec() fonction
regexp.exec(str)
va faire ce qui suit:g
drapeau est utilisé dans la regexp: il sera de retour (à chaque fois qu'il est appelé):[N_MatchedStr, N_Captured1, N_Captured2, ...]
de la prochaineN
match. Important: il n'avancera pas dans le prochain match si l'objet regexp n'est pas stockée dans une variable (ce doit être le même objet)g
drapeau est pas utilisé dans la regexp: il sera de retour le même que si elle avait ung
drapeau et a été appelé pour la première fois et une seule fois.null
Exemple de .exec() (stockées regexp + à l'aide de la
g
flag = il change à chaque appel):Exemples de .exec() quand il est pas change à chaque appel:
Parfois regex.exec() prendra beaucoup plus de temps ensuite de la chaîne.match().
Il vaut la peine de mentionner que si le résultat de la chaîne.match() et de la regex.exec() sont les mêmes (ex: lorsque vous n'utilisez pas \g drapeau),
regex.exec() prendra quelque part entre le x2 x30, puis de la chaîne.match():
Par conséquent, dans de tels cas, l'utilisation de l'approche de "new RegExp().exec()" doit être utilisé uniquement lorsque vous avez besoin d'un programme mondial regex (c'est à dire pour exécuter plus d'une fois).