2011-05-27 13 views
13

¿Hay alguna diferencia entre usar new RegExp("regex"); y /same_regex/ para probar contra una cadena de destino? Estoy haciendo esta pregunta porque obtuve un resultado de validación diferente mientras uso estos dos enfoques. Aquí está el fragmento he usado para validar un campo de correo electrónico:¿Cuál es la diferencia entre Usar RegExp y Usar la notación de barra oblicua para probar contra Cadena?

 

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"); 
    } 
 

me dieron dos resultados inconsistentes:

 

email matched regex1 
email mismatched regex2 

Me pregunto si hay alguna diferencia aquí o que omite algo en este ejemplo concreto?
Para un ejemplo ejecutable por favor refiérase a here

Respuesta

11

Si utiliza el constructor para crear un nuevo objeto RegExp en lugar de la sintaxis literal, tiene que escapar de la \‍ correctamente:

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 es interpretado como x. Entonces, en este caso, el \. se interpreta como ..

+0

En la notación de barra inclinada '\' y '/' fuera de la definición de la clase char también deben escaparse. –

+0

@Philipp: Sí a '/' pero no a la barra invertida. –

3

esta será una ayuda para usted http://www.regular-expressions.info/javascript.html vea la sección 'Cómo utilizar el objeto JavaScript RegExp'

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

2

La diferencia está en escapar, al menos en su caso. Cuando se utiliza // notación, tienes que escapar '/' con '\ /', cuando se está utilizando la notación Regexp que escapa cotizaciones

+0

'/' fuera de la definición de clase char debe ser escapado también –

10

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

Desde Mozilla's developer pages

literales de expresiones regulares proporcionan compilación de la expresión regular cuando se evalúa el guión. Cuando la expresión regular permanezca constante , úsela para un mejor rendimiento .

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

Cuestiones relacionadas