Quelle est la différence entre l'utilisation de RegExp et l'utilisation de la notation de barre oblique pour tester String?

Existe-t-il une différence entre l'utilisation du new RegExp("regex"); Et /same_regex/ pour tester contre une chaîne cible? Je pose cette question parce que j'ai obtenu un résultat de validation différent tout en utilisant ces deux approches. Voici l'extrait que j'ai utilisé pour valider un champ de messagerie:

var email="[email protected]@foo.com"; var regex1 = new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"); var regex2 = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; //using RegExp object if(regex1.test(email)) { console.log("email matched regex1"); } else { console.log("email mismatched regex1"); } //using slash notation if(regex2.test(email)) { console.log("email matched regex2"); } else { console.log("email mismatched regex2"); }
var email="[email protected]@foo.com"; var regex1 = new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"); var regex2 = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; //using RegExp object if(regex1.test(email)) { console.log("email matched regex1"); } else { console.log("email mismatched regex1"); } //using slash notation if(regex2.test(email)) { console.log("email matched regex2"); } else { console.log("email mismatched regex2"); } 

J'ai eu deux résultats incohérents:


 Courrier électronique correspondant à regex1
 E-mail non combiné regex2

Je me demande s'il y a des différences ici ou j'ai omis quelque chose dans cet exemple spécifique?
Pour un exemple exécutable, veuillez vous référer ici

Si vous utilisez le constructeur pour créer un nouvel objet RegExp au lieu de la syntaxe littérale, vous devez échapper à \‍ correctement:

 new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$") 

Ceci est nécessaire car, en JavaScript, toute séquence d'échappement inconnue \x est interprétée comme x . Donc, dans ce cas, le \. Est interprété comme . .

/.../ s'appelle littéral d'expression régulière . new RegExp utilise la fonction constructeur RegExp et crée un objet d'expression régulière.

Des pages de développeurs de Mozilla

Les littéraux d'expression régulière fournissent une compilation de l'expression régulière lorsque le script est évalué. Lorsque l'expression régulière reste constante, utilisez-la pour une meilleure performance.

L'utilisation de la fonction constructeur fournit une compilation d'exécution de l'expression régulière. Utilisez la fonction constructeur lorsque vous savez que le modèle d'expression régulière changera ou que vous ne connaissez pas le motif et que vous l'obtenez à partir d'une autre source, comme l'entrée de l'utilisateur.

Ceci vous aidera http://www.regular-expressions.info/javascript.html voir la section "Comment utiliser l'objet JavaScript RegExp"

Si vous utilisez RegExp (regx) regx devrait être en format de chaîne ex: – \ w + peut être créé comme regx = /\w+/ ou comme regx = new RegExp("\\w+") .

La différence est d'échapper au moins dans votre cas. Lorsque vous utilisez / / notation, vous devez échapper à '/' avec '\ /', lorsque vous utilisez la notation Regexp, vous échappez à des citations