web-dev-qa-db-fra.com

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

Plusieurs fois, j'utilise la fonction string match pour savoir si une chaîne 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?

263
gdoron

Utilisation de base

Voyons d’abord ce que fait chaque fonction:

regexObject . test ( Chaîne )

Exécute la recherche d'une correspondance entre une expression régulière et une chaîne spécifiée. Retourne vrai ou faux .

chaîne . correspondance ( RegExp )

Utilisé pour récupérer les correspondances lors de la correspondance d'une chaîne avec une expression régulière. Retourne un tableau avec les correspondances ou null s'il n'y en a pas.

Puisque null est évalué à false,

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 

Performance

Y a-t-il une différence de performance?

Oui . J'ai trouvé cette courte note dans le site MDN :

Si vous avez besoin de savoir si une chaîne 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! Ceci jsPerf Je montre que la différence est ~ 30% - ~ 60% selon le navigateur:

test vs match | Performance Test

Conclusion

Utilisez .test si vous voulez une vérification booléenne plus rapide. Utilisez .match pour récupérer toutes les correspondances lorsque vous utilisez l'indicateur global g.

408
gdoron

N'oubliez pas de prendre en compte le drapeau global dans votre expression rationnelle:

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

En effet, Regexp garde la trace du lastIndex quand une nouvelle correspondance est trouvée.

97
gtournie