Souvent, j'utilise la chaîne match
pour savoir si une chaîne de caractères correspond à une expression régulière.
if(str.match(/{regex}/))
Y-a-t-il une différence entre ceci :
if (/{regex}/.test(str))
Ils semblent donner le même résultat ?
Souvent, j'utilise la chaîne match
pour savoir si une chaîne de caractères correspond à une expression régulière.
if(str.match(/{regex}/))
Y-a-t-il une différence entre ceci :
if (/{regex}/.test(str))
Ils semblent donner le même résultat ?
Tout d'abord, voyons ce que fait chaque fonction :
regexObject . test ( Chaîne de caractères )
Exécute la recherche d'une correspondance entre une expression régulière et une chaîne de caractères spécifiée. Retourne vrai o faux .
chaîne de caractères . match ( RegExp )
Utilisé pour récupérer les correspondances lors de la mise en correspondance d'une chaîne de caractères avec une expression régulière. Retourne un tableau avec les correspondances ou
null
s'il n'y en a pas.
Depuis null
évalue à false
,
if ( string.match(regex) ) {
// There was a match.
} else {
// No match.
}
Y a-t-il une différence au niveau des performances ?
Oui . J'ai trouvé cette courte note dans le Site du MDN :
Si vous avez besoin de savoir si une chaîne de caractères correspond à une expression régulière regexp, utilisez regexp.test(string).
La différence est-elle significative ?
La réponse, une fois de plus, est OUI ! Ce site jsPerf que j'ai mis ensemble montre que la différence est ~30% - ~60% en fonction du navigateur :
Utilice .test
si vous voulez une vérification booléenne plus rapide. Utilisez .match
pour récupérer toutes les correspondances lors de l'utilisation de la g
le drapeau mondial.
Ce n'est pas très surprenant puisque la fonction chaîne de caractères doit inverser les choses et créer le tableau s'il y a une correspondance. On dirait que je vais continuer à utiliser .test()
. :)
Pourquoi pas une perf pour l'extraction de la valeur.... et pourquoi ne pas ajouter un troisième cas pour .exec().
N'oubliez pas de prendre en compte le drapeau global dans votre regexp :
var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <=
En effet, Regexp conserve la trace du lastIndex lorsqu'une nouvelle correspondance est trouvée.
Je me tapais juste la tête en voyant que mon regex.test() enregistrait aléatoirement "true" puis "false" puis "true"...merci !
Je pense que c'est la meilleure réponse. Elle explique qu'elles ne donnent pas le même résultat et que reg.test() comporte un piège dangereux. Pour moi, cela fait de string.match() le choix évident. Les performances n'ont jamais été un problème pour moi.
C'est important ! Je suis devenu fou en essayant de comprendre pourquoi tous les autres résultats étaient manquants... pour la référence de quelqu'un d'autre qui trouve cela : developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
Ce sont les meilleurs tests que vous trouverez jsperf.com/regexp-test-vs-match-m5
0 votes
@ajax333221. Merci pour le jsperf, mais je ne suis pas sûr que ce soit un bon. La correspondance regex utilise un groupe de correspondance, ce qui n'est pas nécessaire lorsqu'on recherche une valeur booléenne.