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
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");
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".
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.
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"))
Guau, eso es interesante. Acabo de comprobarlo, ¡y tienes razón! Sin embargo, no se menciona en MDN. –
Vea esta explicación: http://stackoverflow.com/a/7964948/651789 – ken
- 1. JavaScript "tupla" notación: ¿cuál es su punto?
- 2. ¿Cuál es el punto del operador nulo en JavaScript?
- 3. JABÓN - ¿Cuál es el punto?
- 4. HashMap.containsValue - ¿Cuál es el punto?
- 5. ¿Cuál es el punto de g ++ -Wreorder?
- 6. ¿Cuál es el punto de System.IO.dll?
- 7. ¿Cuál es el punto de DOCTYPE?
- 8. ¿Cuál es el punto de aclocal?
- 9. ¿Cuál es el punto de los frijoles?
- 10. ¿Cuál es el punto de XPS?
- 11. ¿Cuál es el punto de declarar estilo?
- 12. ¿Cuál es el punto de FILL_AND_STROKE?
- 13. ¿Cuál es el punto de make_heap?
- 14. ¿Cuál es el punto de Convert.ToDateTime (bool)?
- 15. ¿Cuál es el punto de especificar hibernate.jdbc.batch_size?
- 16. ¿Cuál es el punto de document.defaultView?
- 17. ¿Cuál es el punto de MethodImplOptions.InternalCall?
- 18. ¿Cuál es el punto de STL?
- 19. XNA: ¿Cuál es el punto de Descargar()?
- 20. ¿Cuál es el punto de os.error?
- 21. Propiedades de escritura, ¿cuál es el punto?
- 22. ¿Cuál es el punto de setRetainsRegisteredObjects :?
- 23. ¿Cuál es el punto de _MERGE_PROXYSTUB?
- 24. ¿Cuál es el punto de los punteros?
- 25. ¿Cuál es el punto de setArguments?
- 26. HTML DTDs - ¿Cuál es el punto?
- 27. ¿Cuál es el punto en UrbanAirship?
- 28. + [NSString stringWithString:] - ¿Cuál es el punto?
- 29. "multiset" y "multimap": ¿cuál es el punto?
- 30. ¿Cuál es el punto del bloque finally?
¿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