2012-08-11 21 views

Respuesta

36

Uso "\\$\\$" en el segundo parámetro:

String s=" $$"; 
s=s.replaceAll("\\s+\\$\\$","\\$\\$"); 
//or 
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$"); 

El $ es símbolo de grupo en el parámetro de sustitución de expresiones regulares

por lo que necesita para escapar de ella

+0

¿Podría explicarme también por qué java está tratando el segundo parámetro como regex en lugar de cadena normal? – FranXho

+1

No lo trata como una expresión regular. De la documentación para Matcher.appendReplacement, "La cadena de reemplazo puede contener referencias a subsecuencias capturadas durante la coincidencia previa: cada aparición de $ {nombre} o $ g será reemplazada por el resultado de evaluar el grupo (nombre) o grupo (g) correspondiente respectivamente ... Un signo de dólar ($) puede incluirse como un literal en la cadena de reemplazo precediéndolo con una barra diagonal inversa (\ $). " – user393274

5

El problema aquí no es la expresión regular, pero la sustitución:

$ se utiliza para hacer referencia a () grupos coincidentes. Por lo que necesita para escapar de ella, así como con una barra invertida (y una segunda barra invertida para que el compilador Java feliz):

String s=" $$"; 
s = s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
0

$ tiene un significado especial en la cadena de reemplazo, así como en la expresión regular, por lo que tiene que escapar de allí, también:

s=s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
0
String s="$$"; 
     s=s.replaceAll("\\s+\\$\\$","$$"); 
56

De String#replaceAll javadoc:

Tenga en cuenta que las barras invertidas (\) y los signos de dólar ($) en la cadena de reemplazo pueden causar que los resultados sean diferentes a si se tratara de tratados como una cadena de reemplazo literal; ver Matcher.replaceAll. Use Matcher.quoteReplacement (java.lang.String) para suprimir el significado especial de estos caracteres, si lo desea.

Así escapar de una cadena de sustitución arbitraria se puede hacer como la siguiente:

String s = " $$"; 
s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$")); 

también escapar del patrón puede ser hecho con Pattern#quote

String s = " $$"; 
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$")); 
+6

+1. Mucho mejor que escapar de ti mismo –

+1

Esta solución es mejor que la respuesta aceptada en términos de contenido dinámico. –

+0

Dado que la cadena de reemplazo no se conoce en 99.99_9%, esta respuesta tiene mucho más sentido. – AxelH

0

que tenía el mismo problema, así que termino implementando reemplazar todo con split.
los que resuelve la excepción para mí

public static String replaceAll(String source, String key, String value){ 
    String[] split = source.split(Pattern.quote(key)); 
    StringBuilder builder = new StringBuilder(); 
    builder.append(split[0]); 
    for (int i = 1; i < split.length; i++) { 
     builder.append(value); 
     builder.append(split[i]); 
    } 
    while (source.endsWith(key)) { 
     builder.append(value); 
     source = source.substring(0, source.length() - key.length()); 
    } 
    return builder.toString(); 
} 
0

Ésta es la manera correcta. Reemplazar el $ literar por escapado \\ $ str.replaceAll("\\$", "\\\\\\$")

Cuestiones relacionadas