2010-11-05 10 views
5

Estoy tratando de reemplazar una subcadena que contiene el carácter "$". Me encantaría saber por qué no funcionó de esa manera y cómo funcionaría.Reemplazar subcadena (replaceAll) solución

Gracias, USER_UNKNOWN

public class replaceall { 
    public static void main(String args[]) { 
     String s1= "$foo - bar - bla"; 
     System.out.println("Original string:\n"+s1); 
     String s2 = s1.replaceAll("bar", "this works"); 
     System.out.println("new String:\n"+s2); 
     String s3 = s2.replaceAll("$foo", "damn"); 
     System.out.println("new String:\n"+s3); 
    } 

} 
+0

¿Y qué imprime esto? '$ foo - esto funciona - bla'? – Entity

+0

posible duplicado de [Error de barra inclinada con String.replaceAll] (http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell

Respuesta

14

Java's .replaceAll utiliza implícitamente expresiones regulares para reemplazar. Eso significa que $foo se interpreta como un patrón de expresiones regulares, y $ es especial en expresiones regulares (que significa "fin de cadena").

tiene que escapar del $ como

String s3 = s2.replaceAll("\\$foo", "damn"); 

si el objetivo de una variable, utilice Pattern.quote para escapar de todos los caracteres especiales en Java ≥1.5, y si la sustitución es también una variable, utilice Matcher.quoteReplacement.

String s3 = s2.replaceAll(Pattern.quote("$foo"), Matcher.quoteReplacement("damn")); 

En Java ≥1.5, usted podría use .replace instead.

String s3 = s2.replace("$foo", "damn"); 

Resultado: http://www.ideone.com/Jm2c4

+1

Muy buena respuesta, pero en mi humilde opinión está solucionando el problema incorrecto. –

+2

También tenga en cuenta que la cadena de reemplazo para 'replaceAll()' puede necesitar escaparse también (con 'Pattern.quoteReplacement()'). – axtavt

+0

@axtavt: buen punto –

5

IIRC, replaceAll toman una expresión regular: Intenta escapar el $, de esta manera:

String s3 = s2.replaceAll("\\$foo", "damn"); 
9

Si usted no necesita la funcionalidad de expresión regular, no utilice la versión de expresiones regulares.

Uso String.replace(str, str) lugar:

String s = "$$$"; 
String rep = s.replace("$", "€"); 
System.out.println(rep); 
// Output: €€€ 

Referencia:

+1

+1 - Había aceptado esta respuesta. replaceAll es para reemplazar las coincidencias de un patrón, reemplazar por la sustitución de secuencia char (que es exactamente lo que queremos aquí) –

0
public static String safeReplaceAll(String orig, String target, String replacement) { 
    replacement = replacement.replace("$", "\\$"); 
    return orig.replaceAll(target, replacement); 
} 
Cuestiones relacionadas