2009-05-19 12 views
47

Tengo una situación en la que quiero obtener una expresión regular del usuario y ejecutarla contra unos pocos miles de cadenas de entrada. En el manual encontré que el objeto RegExp tiene un método .compile() que se usa para acelerar las cosas en tales casos. Pero ¿por qué tengo que pasar la cadena de expresiones regulares de nuevo si ya los pasé en el constructor? ¿Quizás el constructor hace el compile()?Javascript: ¿cuál es el punto de RegExp.compile()?

Respuesta

83

El RegExp().compile() method is deprecated. Básicamente es lo mismo que el constructor, que supongo que es por qué está en desuso. Solo deberías usar el constructor hoy en día.

En otras palabras, que solía ser capaz de hacer esto:

var regexp = new RegExp("pattern"); 
regexp.compile("new pattern"); 

Pero hoy en día no es diferente de simplemente llamando a:

var regexp = new RegExp("pattern"); 
regexp = new RegExp("new pattern"); 
3

Por lo que yo puedo decir toda RegExp .Compile hace es reemplazar la expresión regular subyacente de un objeto RegExp. Creo que la compilación puede haber tenido valor en el pasado, pero todos los motores JS modernos "compilan" la expresión regular en la primera llamada y almacenan en caché esa versión "compilada".

+1

¿Qué es exactamente lo que los motores de caché? ¿Y siempre lo hacen? ¿Cuánto tiempo se mantiene una expresión en el caché? Estoy particularmente interesado en V8. – CoDEmanX

6

Y con Opera 11, ejecutar RegExp.compile() en realidad causará errores.

Evidentemente, cuando Opera "compila" una expresión regular, envuelve la cadena re.source en barras inclinadas (por ejemplo, re.source == "^(.)" se convierte en "/^(.)/"). Si compila manualmente la expresión regular, Opera no reconoce este hecho y continúa y la vuelve a compilar (re.source se convierte en "//^(.)//"). Cada compilación da como resultado un conjunto adicional de barras diagonales, lo que cambia el significado de la expresión regular y los resultados en errores.

2

debe compilar su primera expresión regular usarlo si está utilizando /, pruebe esto: las expresiones regulares

var regex=new RegExp('/[a-zA-Z]/') 
 

 
console.log("not compiled with escape /", regex.test("ciao")) 
 

 
regex.compile() 
 

 
console.log("compiled", regex.test("ciao")) 
 

 
var regex=new RegExp('[a-zA-Z]') 
 

 
console.log("not compiled, but no escape /", regex.test("ciao"))

+2

Guau, eso es interesante. Acabo de comprobarlo, ¡y tienes razón! Sin embargo, no se menciona en MDN. –

+2

Vea esta explicación: http://stackoverflow.com/a/7964948/651789 – ken