2011-06-02 16 views
16
String delimiter = "\\*\\*"; 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Entry<String, String> entry : mp.entrySet()) { 
    html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
} 

Por lo general, debería reemplazar esas dos cadenas, pero no es así. ¿Alguien tiene una idea?Java String replace no funciona

+1

¿Cómo sabes que no está funcionando? No está imprimiendo ni almacenando en ninguna parte. – CoolBeans

Respuesta

47

La cadena es inmutable, lo que significa que la referencia html no cambia, sino que el método de reemplazo devuelve un nuevo objeto String que debe asignar.

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
+0

Acaba de ser probado, pero no en serio ... Las nuevas cadenas simplemente no serán reemplazadas. - Editar: fue maravilloso, después de haber ajustado mi delimitador. – Vilius

+0

Esta es la respuesta correcta. – codingscientist

+0

¡La inmutabilidad fue la culpable! –

6

El método de reemplazo devuelve su resultado, que está descartando.

4

No necesita escapar el carácter *. Diferencia entre replace y replaceAll es que replace escapa a cualquier metacaracteres de expresiones regulares para nosotros automáticamente:

String delimiter = "**"; 
+0

Muchas gracias, tuve que combinar tu pista con la de Yishai. – Vilius

1

como dijo usted va a desechar los resultados y reemplazar no toma una expresión regular solamente una secuencia de carbón literal para ser reemplazado por lo que don' t necesidad de escapar en el delimitador

pero replaceAll y replaceFirst toman una serie de expresiones regulares (mal diseño que)

y como un aparte es recomendable utilizar Patter.quote(String) y Matcher.quoteReplacement(String) para asegurar que ningún extraño las cosas están sucediendo al utilizar expresiones regulares (que es un poco más fácil y asegura que no hay error en escapar de los caracteres)

aquí es para cuando sólo una ocurrencia debe ser reemplazado

String delimiter = "**"; 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Map.Entry<String, String> entry : mp.entrySet()) { 
    html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
} 

y aquí está para cuando múltiples ocurrencias deben ser reemplazados

String delimiter = "**";//unescaped because I'm handling that in my replace 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Map.Entry<String, String> entry : mp.entrySet()) { 
    html = html.replaceAll(Pattern.quote(delimiter + entry.getKey()+ delimiter), Matcher.quoteReplacement(entry.getValue())); 
} 
+0

esos dos ejemplos hacen exactamente lo mismo – user102008

1

Analogía:

Si usted tiene un archivo inmutable en su escritorio. Para hacer algunos cambios, haz una copia y reemplaza. Esto lleva a un estado en el que no puede acceder al archivo anterior a menos que tenga una copia de seguridad.

De la misma manera, en la mayoría de los lenguajes de programación como Java, JavaScript, python y C# el método replace no reemplaza/modificar la cadena. Solo funciona sobre la cadena anterior y devuelve una nueva cadena con todos los cambios.

Ahora, si realmente desea almacenar los cambios, deberá obtener la cadena devuelta en la misma variable (si su situación lo permite) o en una nueva variable.

1

cadena es un tipo inmutable, por lo que debería nuevas un objeto String para guardar la nueva cadena devuelta por el método de sustituir

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
Cuestiones relacionadas