1. Información general
La sustitución de cadenas es una operación estándar cuando procesamos cadenas en Java.
Gracias al práctico método replaceAll () en la clase String , podemos realizar fácilmente la sustitución de cadenas con expresiones regulares. Sin embargo, a veces las expresiones puede ser confuso, por ejemplo, \ s y \ s +.
En este breve tutorial, veremos la diferencia entre las dos expresiones regulares a través de ejemplos.
2. La diferencia entre \ s y \ s +
La expresión regular \ s es una clase de caracteres predefinida. Indica un solo carácter de espacio en blanco. Repasemos el conjunto de caracteres de espacios en blanco:
[ \t\n\x0B\f\r]
El signo más + es un cuantificador codicioso, lo que significa una o más veces. Por ejemplo, la expresión X + coincide con uno o más caracteres X.
Por lo tanto, la expresión regular \ s coincide con un solo carácter de espacio en blanco, mientras que \ s + coincidirá con uno o más caracteres de espacio en blanco.
3. reemplaceTodo () con un reemplazo que no esté vacío
Hemos aprendido el significado de las expresiones regulares \ s y \ s + .
Ahora, echemos un vistazo a cómo el método replaceAll () se comporta de manera diferente con estas dos expresiones regulares.
Usaremos una cadena como texto de entrada para todos los ejemplos:
String INPUT_STR = "Text With Whitespaces! ";
Intentemos pasar \ s al método replaceAll () como argumento:
String result = INPUT_STR.replaceAll("\\s", "_"); assertEquals("Text___With_____Whitespaces!___", result);
El método replaceAll () busca caracteres de un solo espacio en blanco y reemplaza cada coincidencia con un guión bajo. Tenemos once caracteres de espacio en blanco en el texto de entrada. Así, se producirán once reemplazos.
A continuación, pasemos la expresión regular \ s + al método replaceAll () :
String result = INPUT_STR.replaceAll("\\s+", "_"); assertEquals("Text_With_Whitespaces!_", result);
Debido al cuantificador codicioso + , el método replaceAll () coincidirá con la secuencia más larga de caracteres de espacios en blanco contiguos y reemplazará cada coincidencia con un guión bajo.
En nuestro texto de entrada, tenemos tres secuencias de caracteres de espacios en blanco contiguos. Por lo tanto, cada uno de los tres se convertirá en un subrayado.
4. reemplace todo () con un reemplazo vacío
Otro uso común del método replaceAll () es eliminar patrones coincidentes del texto de entrada. Normalmente lo hacemos pasando una cadena vacía como reemplazo del método.
Veamos qué resultado obtendremos si eliminamos los espacios en blanco usando el método replaceAll () con la expresión regular \ s :
String result1 = INPUT_STR.replaceAll("\\s", ""); assertEquals("TextWithWhitespaces!", result1);
Ahora, pasaremos la otra expresión regular \ s + al método replaceAll () :
String result2 = INPUT_STR.replaceAll("\\s+", ""); assertEquals("TextWithWhitespaces!", result2);
Debido a que el reemplazo es una cadena vacía, las dos llamadas replaceAll () producen el mismo resultado, aunque las dos expresiones regulares tienen significados diferentes:
assertEquals(result1, result2);
Si comparamos las dos llamadas replaceAll () , la que tiene \ s + es más eficiente. Esto se debe a que hace el trabajo con solo tres reemplazos, mientras que la llamada con \ s hará once reemplazos.
5. Conclusión
En este breve artículo, hemos aprendido acerca de las expresiones regulares \ s y \ s + .
También vimos cómo el método replaceAll () se comportaba de manera diferente con las dos expresiones.
Como siempre, el código está disponible en GitHub.