¿Cómo eliminar solo los espacios finales de una cadena en Java y mantener los espacios iniciales?

La función trim() elimina tanto el espacio inicial como el posterior, sin embargo, si solo quiero eliminar el espacio final de una cadena, ¿cómo puedo hacerlo?

¡Gracias!

Con la expresión regular \s++$ , puede reemplazar todos los caracteres de espacio final (incluye caracteres de espacio y tabulación) sin nada ( "" ).

 final String text = " foo "; System.out.println(text.replaceFirst("\\s++$", "")); 

Salida

  foo 

Demostración en línea.

Aquí hay un desglose de la expresión regular:

  • \s – cualquier personaje de espacio en blanco,
  • ++ – coincide con uno o más de los tokens anteriores (posesivamente); es decir, una coincidencia de uno o más caracteres en espacio en blanco. El patrón + se usa en su forma posesiva ++ , que demora menos tiempo para detectar el caso cuando el patrón no coincide.
  • $ – el final de la cadena.

Por lo tanto, la expresión regular coincidirá con tantos espacios en blanco como sea posible, seguido directamente por el final de la cadena: en otras palabras, el espacio en blanco final.

La inversión en el aprendizaje de expresiones regulares será más valiosa si necesita ampliar sus requisitos más adelante.

Referencias

  • Sintaxis de expresiones regulares de Java

Otra opción es utilizar Apache Commons StringUtils , específicamente StringUtils.stripEnd

 String stripped = StringUtils.stripEnd(" my lousy string "," "); 

java.lang.String.trim() un poco el método original java.lang.String.trim() y debería funcionar:

  public String trim(String str) { int len = str.length(); int st = 0; char[] val = str.toCharArray(); while ((st < len) && (val[len - 1] <= ' ')) { len--; } return str.substring(st, len); } 

Prueba:

  Test test = new Test(); String sample = " Hello World "; // A String with trailing and leading spaces System.out.println(test.trim(sample) + " // No trailing spaces left"); 

Salida:

  Hello World // No trailing spaces left 

La respuesta más práctica es la de @May, la de Ahmad es inversa a lo que querías, pero esto es lo que se me ocurrió en caso de que prefieras no usar herramientas desconocidas o ver un enfoque concreto.

 public String trimEnd( String myString ) { for ( int i = myString.length() - 1; i >= 0; --i ) { if ( myString.charAt(i) == ' ' ) { continue; } else { myString = myString.substring( 0, ( i + 1 ) ); break; } } return myString; } 

Usado como:

 public static void main( String[] args ) { String s = " Some text here "; System.out.println( s + "|" ); s = trimEnd( s ); System.out.println( s + "|" ); } 

Salida:

 Some text here | Some text here| 

La mejor manera en mi opinión:

 public static String trimEnd(String source) { int pos = source.length() - 1; while ((pos >= 0) && Character.isWhitespace(source.charAt(pos))) { pos--; } pos++; return (pos < source.length()) ? source.substring(0, pos) : source; } 

Esto no asigna ningún objeto temporal para hacer el trabajo y es más rápido que usar una expresión regular. También elimina todos los espacios en blanco, no solo ''.

Aquí hay una versión muy corta, eficiente y fácil de leer:

 public static String trimTrailing(String str) { if (str != null) { for (int i = str.length() - 1; i >= 0; --i) { if (str.charAt(i) != ' ') { return str.substring(0, i + 1); } } } return str; } 

Como alternativa a str.charAt(i) != ' ' , También puede usar !Character.isWhitespace(str.charAt(i) si desea usar una definición más amplia de espacios en blanco.

Valor de cadena = “Bienvenido a Java”;

Entonces podemos usar

value = value.trim ();

Spring framework proporciona un org.springframework.util.StringUtils útil.

trimTrailingWhitespace

Este código está destinado a leerse de la manera más fácil posible utilizando nombres descriptivos (y evitando expresiones regulares).

Utiliza Java 8’s Optional por lo que no es apropiado para todos.

 public static String removeTrailingWhitspace(String string) { while (hasWhitespaceLastCharacter(string)) { string = removeLastCharacter(string); } return string; } private static boolean hasWhitespaceLastCharacter(String string) { return getLastCharacter(string) .map(Character::isWhitespace) .orElse(false); } private static Optional getLastCharacter(String string) { if (string.isEmpty()) { return Optional.empty(); } return Optional.of(string.charAt(string.length() - 1)); } private static String removeLastCharacter(String string) { if (string.isEmpty()) { throw new IllegalArgumentException("String must not be empty"); } return string.substring(0, string.length() - 1); }