Alternativas L-Trim y R-Trim en Java

1. Información general

El método String.trim () elimina los espacios en blanco iniciales y finales. Pero, no hay soporte para simplemente hacer un L-Trim o R-Trim.

En este tutorial, veremos algunas formas en las que podemos implementar esto; al final, compararemos su desempeño.

2. while Loop

La solución más sencilla es ir a través de la cadena mediante un par de mientras que los bucles .

Para L-Trim, leeremos la cadena de izquierda a derecha hasta que encontremos un carácter que no sea un espacio en blanco:

int i = 0; while (i < s.length() && Character.isWhitespace(s.charAt(i))) { i++; } String ltrim = s.substring(i); 

ltrim es entonces una subcadena que comienza en el primer carácter que no es un espacio en blanco.

O para R-Trim, leeremos nuestra cadena de derecha a izquierda hasta que encontremos un carácter que no sea un espacio en blanco:

int i = s.length()-1; while (i >= 0 && Character.isWhitespace(s.charAt(i))) { i--; } String rtrim = s.substring(0,i+1);

rtrim es entonces una subcadena que comienza al principio y termina en el primer carácter que no es un espacio en blanco.

3. String.replaceAll usando expresiones regulares

Otra opción es usar String.replaceAll () y una expresión regular:

String ltrim = src.replaceAll("^\\s+", ""); String rtrim = src.replaceAll("\\s+$", "");

(\\ s +) es la expresión regular que coincide con uno o varios caracteres de espacio en blanco. El signo de intercalación (^) y el ($) al principio y al final de la expresión regular coinciden con el principio y el final de una línea.

4. Pattern.compile () y .matcher ()

También podemos reutilizar expresiones regulares con java.util.regex.Pattern :

private static Pattern LTRIM = Pattern.compile("^\\s+"); private static Pattern RTRIM = Pattern.compile("\\s+$"); String ltrim = LTRIM.matcher(s).replaceAll(""); String rtim = RTRIM.matcher(s).replaceAll("");

5. Apache Commons

Además, podemos aprovechar los métodos Apache Commons StringUtils # stripStart y #stripEnd para eliminar los espacios en blanco.

Para eso, primero agreguemos la dependencia commons-lang3 :

 org.apache.commons commons-lang3 3.8.1 

Siguiendo la documentación, usamos null para quitar el espacio en blanco:

String ltrim = StringUtils.stripStart(src, null); String rtrim = StringUtils.stripEnd(src, null);

6. Guayaba

Finalmente, aprovecharemos los métodos Guava CharMatcher # trimLeadingFrom y #trimTrailingFrom para obtener el mismo resultado.

Nuevamente, agreguemos la dependencia apropiada de Maven, esta vez es guayaba :

 com.google.guava guava 28.2-jre 

Y en Guava, es bastante similar a cómo se hace en Apache Commons, solo que con métodos más específicos:

String ltrim = CharMatcher.whitespace().trimLeadingFrom(s); String rtrim = CharMatcher.whitespace().trimTrailingFrom(s);

7. Comparación de desempeño

Veamos el rendimiento de los métodos. Como es habitual, utilizaremos el framework de código abierto Java Microbenchmark Harness (JMH) para comparar las diferentes alternativas en nanosegundos.

7.1. Configuración de referencia

Para la configuración inicial del punto de referencia, hemos utilizado cinco bifurcaciones y tiempos de cálculo de tiempo promedio en nanosegundos:

@Fork(5) @State(Scope.Benchmark) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS)

En el método de configuración, estamos inicializando el campo de mensaje original y la cadena resultante para comparar con:

@Setup public void setup() { src = " White spaces left and right "; ltrimResult = "White spaces left and right "; rtrimResult = " White spaces left and right"; }

Todos los puntos de referencia primero eliminan el espacio en blanco izquierdo, luego eliminan el espacio en blanco derecho y finalmente comparan los resultados con sus cadenas esperadas.

7.2. while Loop

Para nuestro primer punto de referencia, vamos a usar el tiempo enfoque de bucle:

@Benchmark public boolean whileCharacters() { String ltrim = whileLtrim(src); String rtrim = whileRtrim(src); return checkStrings(ltrim, rtrim); }

7.3. String.replaceAll () con expresión regular

Entonces, intentemos String.replaceAll () :

@Benchmark public boolean replaceAllRegularExpression() { String ltrim = src.replaceAll("^\\s+", ""); String rtrim = src.replaceAll("\\s+$", ""); return checkStrings(ltrim, rtrim); }

7.4. Pattern.compile (). Match ()

Después de eso viene Pattern.compile (). Matches () :

@Benchmark public boolean patternMatchesLTtrimRTrim() { String ltrim = patternLtrim(src); String rtrim = patternRtrim(src); return checkStrings(ltrim, rtrim); }

7.5. Apache Commons

Cuarto, Apache Commons:

@Benchmark public boolean apacheCommonsStringUtils() { String ltrim = StringUtils.stripStart(src, " "); String rtrim = StringUtils.stripEnd(src, " "); return checkStrings(ltrim, rtrim); }

7.6. Guayaba

Y finalmente, usemos Guayaba:

@Benchmark public boolean guavaCharMatcher() { String ltrim = CharMatcher.whitespace().trimLeadingFrom(src); String rtrim = CharMatcher.whitespace().trimTrailingFrom(src); return checkStrings(ltrim, rtrim); }

7.7. Análisis de los resultados

Y deberíamos obtener algunos resultados similares a los siguientes:

# Run complete. Total time: 00:16:57 Benchmark Mode Cnt Score Error Units LTrimRTrim.apacheCommonsStringUtils avgt 100 108,718 ± 4,503 ns/op LTrimRTrim.guavaCharMatcher avgt 100 113,601 ± 5,563 ns/op LTrimRTrim.patternMatchesLTtrimRTrim avgt 100 850,085 ± 17,578 ns/op LTrimRTrim.replaceAllRegularExpression avgt 100 1046,660 ± 7,151 ns/op LTrimRTrim.whileCharacters avgt 100 110,379 ± 1,032 ns/op

¡Y parece que nuestros ganadores son el while loop, Apache Commons y Guava!

8. Conclusión

En este tutorial, analizamos algunas formas diferentes de eliminar los espacios en blanco al principio y al final de una cadena .

Usamos while loop, String.replaceAll (), Pattern.matcher (). ReplaceAll (), Apache Commons y Guava para obtener este resultado.

Como siempre, el código está disponible en GitHub.