updateone update java string replace

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());