martes, 20 de marzo de 2018

El simbolo dolar y los problemas con el replaceAll

Esta vez venimos con algo muy sencillo y es porque el simbolo dolar ($) da problemas al usarse dentro del replaceAll. Aunque el asunto es que no solo da problema el simbolo dollar, sino tambien la barra inversa (\) y no es solo en el replaceAll sino también en el replaceFirst. 

Si ejecutamos el siguient código, nos dará la excepción java.lang.IllegalArgumentException, indicando que es por: 'Illegal group reference: group index is missing'.

String json1 = "{\"object\":{\"id\":\"1\",\"attribute\":\"value\"}}";
String sProblematic = "value_with_$";
System.out.println(json1.replaceAll("1", sProblematic));

El porque viene explicado en la propia documentación, y es porque el dolar será tratado como parte de una expresión regular y el indicador del comienzo de una subsecuencia. La barra inversa en cambio nos servirá para escapar caracteres especiales. 

¿Cual es la solución? Pues escapar el simbolo del dolar, lo cual podemos hacer de una forma 'manual' o a través de 'Matcher.quoteReplacement' que nos permitirá realizarlo de forma más limpia. Ejemplo:

String json1 = "{\"object\":{\"id\":\"1\",\"attribute\":\"value\"}}";
System.out.println(json1.replaceAll("1", "value_with_\\$"));
System.out.println(json1.replaceAll("1", Matcher.quoteReplacement("value_with_$")));

No hay comentarios:

Publicar un comentario