update - Java String replace no funciona
updateone mongodb c# (6)
El método de reemplazo devuelve su resultado, que está descartando.
Esta pregunta ya tiene una respuesta aquí:
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());
}
Eso generalmente debería reemplazar esas dos cadenas, pero no es así. ¿Alguien tiene una idea?
La cadena es inmutable, lo que significa que la referencia html no cambia, en lugar del método de reemplazo devuelve un nuevo objeto String que debe asignar.
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());
como se dijo, está descartando los resultados y reemplazar no toma una expresión regular solo una secuencia de caracteres literales para ser reemplazada para que no tenga que escapar en el delimitador
pero replaceAll y replaceFirst toman una cadena de expresiones regulares (mal diseño)
y como un lado, es aconsejable usar Patter.quote(String)
y Matcher.quoteReplacement(String)
para asegurar que no haya cosas extrañas al usar regex (es un poco más fácil y asegura que no haya ningún error al escapar de los caracteres)
aquí está para cuando solo se debe reemplazar una ocurrencia
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 se deben reemplazar múltiples ocurrencias
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()));
}
Analogía:
Si tienes un archivo inmutable en tu 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 cómputo como Java
, JavaScript
, python
y C#
el método de reemplazo no reemplaza / modifica el String. 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.
No necesitas escapar *
personaje. La diferencia entre replace
y replaceAll
es que replace
escapa los metacaracteres regex automáticamente por nosotros:
String delimiter = "**";
La cadena es un tipo inmutable, por lo que deberíamos crear un nuevo objeto String para guardar la nueva Cadena devuelta por el Método de reemplazo.
html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue());