¿Cuál es la diferencia entre usar “nuevo RegExp” y usar la notación de barra inclinada para crear una expresión regular?

¿Hay alguna diferencia entre usar el new RegExp("regex"); y /same_regex/ para probar contra una cadena objective? Estoy haciendo esta pregunta porque obtuve un resultado de validación diferente mientras uso estos dos enfoques. Aquí está el fragmento que utilicé para validar un campo de correo electrónico:

var email="didxga@gmail.comblah@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="didxga@gmail.comblah@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"); } 

Tengo dos resultados inconsistentes:


 correo electrónico coincide con regex1
 correo electrónico no coincide con regex2

Me pregunto si hay alguna diferencia aquí o si omití algo en este ejemplo específico.
Para un ejemplo ejecutable, consulte aquí

Si usa el constructor para crear un nuevo objeto RegExp en lugar de la syntax literal, necesita escapar el \‍ propermente:

 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])?$") 

Esto es necesario ya que en JavaScript cualquier secuencia de escape desconocida \x se interpreta como x . Entonces en este caso el \. se interpreta como . .

/.../ se llama literal de expresión regular . new RegExp utiliza la función de constructor RegExp y crea un objeto de expresión regular.

De las páginas de desarrolladores de Mozilla

Los literales de expresión regular proporcionan la comstackción de la expresión regular cuando se evalúa el guión. Cuando la expresión regular permanezca constante, utilícela para un mejor rendimiento.

El uso de la función de constructor proporciona la comstackción en tiempo de ejecución de la expresión regular. Use la función constructora cuando sepa que el patrón de expresión regular cambiará, o no conoce el patrón y lo está obteniendo de otra fuente, como la entrada del usuario.

esto será una ayuda para usted http://www.regular-expressions.info/javascript.html vea la sección ‘Cómo usar el objeto RegExp de JavaScript’

si está utilizando RegExp (regx), regx debería estar en formato de cadena ex: – \ w + se puede crear como regx = /\w+/ o como regx = new RegExp("\\w+") .

La diferencia está en escapar, al menos en tu caso. Cuando usas / / notación, tienes que escapar ‘/’ con ‘\ /’, cuando usas la notación Regexp escapas