388 votes

regex.test V.S. string.match pour savoir si une chaîne de caractères correspond à une expression régulière

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 ?

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.

584voto

gdoron Points 61066

Utilisation de base

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.
} 

Performance

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 :

test vs match | Performance Test

Conclusion

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.

9 votes

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() . :)

0 votes

Pourquoi pas une perf pour l'extraction de la valeur.... et pourquoi ne pas ajouter un troisième cas pour .exec().

0 votes

@livingston_mechanical, parce que ce n'était pas le sujet du post.

203voto

gtournie Points 449

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.

39 votes

Je me tapais juste la tête en voyant que mon regex.test() enregistrait aléatoirement "true" puis "false" puis "true"...merci !

19 votes

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.

9 votes

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.com

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.

Powered by:

X