2010-12-20 9 views

Respuesta

7

Ambos evalúan a ser la misma expresión regular exacta, pero la primera es un literal, lo que significa que no puede use cualquier variable dentro de él, no puede generar dinámicamente una expresión regular.

El segundo usa explícitamente el constructor y se puede usar para crear expresiones regulares dinámicas.

var x = '3', r = (new RegExp(x + '\d')); r.test('3d') 

Lo anterior es un ejemplo de la construcción de la expresión regular de forma dinámica con el constructor, que no se puede hacer en forma literal.

En el 99% de los casos bastará con la primera versión (literal) para todas sus expresiones regulares en JS. En un escenario avanzado donde necesita decir, la entrada del usuario para construir dinámicamente una expresión regular, entonces es cuando necesitará la segunda forma.

editar # 1: La primera coincide con un dígito, el segundo simplemente coincide con la carta d. Tienes que escapar dos veces del segundo para que sea igual al primero, lo cual supongo que querías hacer. Solo recuerde que el consejo que escribí arriba es exacto si el segundo ejemplo es nuevo RegExp ('\ d').

/\d/.test('3') // true 
(new RegExp('\d')).test('3') // false 
(new RegExp('\\d')).test('3') // true 
+1

Er, la expresión regular '3 \ d' no coincide con' "3d" '... – Amber

+0

Gracias por la explicación, la razón por la que pedí era que tenía esta expresión/^ + | [\\/#;] | + $/gi (1 o más espacios O contiene \/#; O termina con uno o más espacios). Al usar el no constructor cada vez impar el resultado resultó en falso. P.ej. el resultado fue alterno. Al usar el constructor, todo funcionó como se esperaba cada vez. ¡Extraño! – bob

+0

Hay otra diferencia más: el literal solo crea * un * objeto en * tiempo de análisis * mientras que la función de constructor siempre crea un nuevo objeto. Sin embargo, esto se cambiará en ES5 y el literal siempre devolverá un nuevo objeto. –

Cuestiones relacionadas