2010-09-01 12 views
7

En Java, se puede tratar de hacer una expresión regular que coincida con la URL stackoverflow.com usando Pattern.compile("stackoverflow.com"). Pero esto sería incorrecto porque el . tiene un significado especial en expresiones regulares. La forma más fácil de solucionar esto es escribiendo Pattern.compile(Pattern.quote("stackoverflow.com")) que sale a: Pattern.compile("\\Qstackoverflow.com\\E") que "quotes" the entire string.replicar la funcionalidad de "Pattern.quote" de Java en un JavaScript RegExp

Quiero hacer lo mismo en JavaScript, pero las expresiones regulares de JavaScript no asignan ningún significado a \Q y \E y no parece que haya un equivalente de JavaScript, por lo que no estoy seguro de cómo hacerlo al respecto. Mi primer pensamiento (ver mi respuesta a continuación) es simplemente poner una barra invertida antes de cualquier personaje que tenga un significado especial en una expresión regular de JavaScript, pero esto parece potencialmente propenso a errores y sospecho que alguien podría saber de una mejor manera.

Esto es para una extensión de Firefox, por lo que las soluciones específicas de Mozilla están bien.

+0

Para cualquier persona que se encuentra con esto en el futuro, y es curioso, terminé la solución de una manera diferente. Quería una expresión regular que coincidiera con '" 'seguida de una cadena en particular, seguida de' "'. Terminé buscando algo como '/" [^ "] +"/'(cita, un montón de caracteres que no son de cita, luego otra cita) y luego revisando todas las coincidencias para encontrar la que coincidía con la cadena en particular Yo quería. – MatrixFrog

Respuesta

6

dar más detalles sobre mi sugerencia, sería algo como esto:

// A RegExp that matches all the characters which have a special meaning in a RegExp 
var regexpSpecialChars = /([\[\]\^\$\|\(\)\\\+\*\?\{\}\=\!])/gi; 

No estoy seguro si esto es del todo bien, ya que algunos caracteres (como ! y =), sólo parecen tener un significado especial en determinadas situaciones. Pero suponiendo que lo es, entonces se haría

var quotedURL = url.replace(regexpSpecialChars, '\\$1'); 

para sustituir, por ejemplo, todos los $ 's con \$' s. A continuación, sólo se puede construir a partir de la expresión regular quotedURL:

var myRegExp = new RegExp(quotedURL, 'gi'); 
+0

AFAIK, escapando todo menos las letras y los dígitos, también hace que el resultado sea aún menos legible, pero es un poco más simple (y IIRC había en algún lugar una declaración de que funcionaría incluso cuando caracteres adicionales obtuvieran su significado especial, pero ya no sé de qué idioma se trataba: D). – maaartinus

Cuestiones relacionadas