2011-01-11 21 views
14

¿Hay alguna manera de escapar (o proteger) los caracteres especiales en una expresión regular?regex: ¿cómo escapar barras diagonales inversas y caracteres especiales?

Lo que me gustaría hacer es crear un sencillo comprobador de expresiones regulares:

import java.util.regex.*; 
class TestRegex { 
    public static void main(String ... args) { 
     System.out.printf("%s ~= %s ? %s %n" , args[0], args[1], Pattern.matches(args[0], args[1])); 
    } 
} 

Qué funciona muy bien para poner a prueba mis patrones antes de plug-in de ellas en el programa:

$java TestRegex "\d" 1 
\d ~= 1 ? true 
$java TestRegex "\d" 12 
\d ~= 12 ? false 
$java TestRegex "\d+" 12 
\d+ ~= 12 ? true 
$java TestRegex "\d+" a12 
\d+ ~= a12 ? false 
$java TestRegex "\d+" "" 
\d+ ~= ? false 

El siguiente Lo que hago es usar este patrón en mi programa, pero cada vez que tengo que escabullirlo manualmente:

Pattern p = Pattern.compile(/*copy pasted regex here */); 

Y en esta muestra, sustituya: \d con \\d. Después de un tiempo, esto se vuelve muy irritante.

P. ¿Cómo puedo escapar automáticamente de estos caracteres especiales?

Respuesta

25

Solo necesita reemplazar todas las barras diagonales inversas con doble barra invertida. Esto es un poco complicado ya que la función replaceAll en String realmente ejecuta una expresión regular y primero tiene que escapar de la barra invertida porque es literal (rindiendo \\), y luego escaparse de nuevo debido a la expresión regular (rindiendo \\\\). La sustitución sufre un destino similar y requiere dos de tales secuencias de escape por lo que es un total de 8 barras invertidas:

System.out.printf("%s ~= %s ? %s %n", 
    args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ... 
+0

consigo: 'Excepción en hilo java.util.regex.PatternSyntaxException "principal": error interno inesperado cerca de índice 1 'http://pastebin.com/aEWSibXv – OscarRyz

+0

Son momentos como estos en los que deseo que Java tenga una mejor sintaxis para cadenas literales. – Hiro2k

+0

@Oscar: oops, tienes que escapar una vez por un String literal y otra vez porque 'replaceAll' es en sí mismo una expresión regular. Corregido ahora. –

Cuestiones relacionadas