Cómo recortar el espacio en blanco de una cadena?

Estoy escribiendo esta función para una aplicación J2ME, por lo que no tengo disponibles algunas de las clases Java más avanzadas / modernas. Estoy obteniendo java.lang.ArrayIndexOutOfBoundsException en esto. Por lo tanto, al parecer, o no le gusta la forma en que he inicializado la matriz newChars , o no estoy haciendo algo correctamente al llamar a System.arraycopy .

 /* * remove any leading and trailing spaces */ public static String trim(String str) { char[] chars = str.toCharArray(); int len = chars.length; // leading while ( (len > 0 ) && ( chars[0] == ' ' ) ) { char[] newChars = new char[] {}; // initialize empty array System.arraycopy(chars, 1, newChars, 0, len - 1); chars = newChars; len = chars.length; } // TODO: trailing return chars.toString(); } 

La forma más sencilla de recortar los espacios en blanco String.trim() y finales es llamar a String.trim() . Si solo desea recortar solo los espacios iniciales y finales (en lugar de todos los espacios en blanco StringUtils.strip(String, String) y finales), existe un método de Apache commons llamado StringUtils.strip(String, String) que puede hacer esto; llámalo con " " como segundo argumento.

Su código intentado tiene varios errores y es fundamentalmente ineficiente. Si realmente desea implementar esto usted mismo, entonces debe:

  1. contar los personajes principales del espacio
  2. contar los caracteres del espacio final
  3. si cualquiera de los recuentos no es cero, llame a String.substring(from, end) para crear una nueva cadena que contenga los caracteres que desea conservar.

Este enfoque evita copiar cualquier carácter 1 .


1 – En realidad, eso depende de la implementación de String . Para algunas implementaciones, no habrá copia, para otras se realizará una única copia. Pero, o bien es una mejora en su enfoque, que implica un mínimo de 2 copias, y más si hay algún personaje para recortar.

String.trim() es muy antiguo, al menos para Java 1.3. Usted no tiene esto?

Antes que nada, lo que otros dijeron sobre String.trim() . Realmente, no reinventes la rueda.

Pero, para que conste, lo que no funciona con tu código es que las matrices de Java no se pueden redimensionar. Cuando inicialmente configura su matriz objective, la crea como una matriz de tamaño 0. A continuación, le System.arraycopy a System.arraycopy que rellene len - 1 caracteres allí. Eso no va a funcionar. Si quieres que funcione, tendrás que configurar la matriz como:

 char[] newChars = new char[len - 1]; 

Pero eso es increíblemente ineficiente, reasignando y copiando una nueva matriz cada vez que pasa el ciclo. Use los tres pasos que mencionó Stephen C, que termina con una substring .

Apache StringUtils.strip es la mejor respuesta aquí que funciona con todos los caracteres de espacio en blanco esperados (no solo espacio) y se puede descargar aquí :

Aquí está el código relevante extraído de este archivo fuente para implementarlo en su propia clase si así lo desea, pero en realidad, ¡simplemente descargue y use StringUtils para obtener más inversión por su dinero! Tenga en cuenta que puede usar StringUtils.stripStart para recortar cualquier carácter principal de una cadena java.

 public static String strip(final String str) { return strip(str, null); } public static String stripStart(final String str, final String stripChars) { int strLen; if (str == null || (strLen = str.length()) == 0) { return str; } int start = 0; if (stripChars == null) { while (start != strLen && Character.isWhitespace(str.charAt(start))) { start++; } } else if (stripChars.isEmpty()) { return str; } else { while (start != strLen && stripChars.indexOf(str.charAt(start)) != INDEX_NOT_FOUND) { start++; } } return str.substring(start); } public static String stripEnd(final String str, final String stripChars) { int end; if (str == null || (end = str.length()) == 0) { return str; } if (stripChars == null) { while (end != 0 && Character.isWhitespace(str.charAt(end - 1))) { end--; } } else if (stripChars.isEmpty()) { return str; } else { while (end != 0 && stripChars.indexOf(str.charAt(end - 1)) != INDEX_NOT_FOUND) { end--; } } return str.substring(0, end); } public static String strip(String str, final String stripChars) { if (isEmpty(str)) { return str; } str = stripStart(str, stripChars); return stripEnd(str, stripChars); } 

Con JDK / 11, ahora puede utilizar la API String.strip para devolver una cadena cuyo valor es esta cadena, con todos los espacios en blanco iniciales y finales eliminados. El javadoc para el mismo es:

 /** * Returns a string whose value is this string, with all leading * and trailing {@link Character#isWhitespace(int) white space} * removed. * 

* If this {@code String} object represents an empty string, * or if all code points in this string are * {@link Character#isWhitespace(int) white space}, then an empty string * is returned. *

* Otherwise, returns a substring of this string beginning with the first * code point that is not a {@link Character#isWhitespace(int) white space} * up to and including the last code point that is not a * {@link Character#isWhitespace(int) white space}. *

* This method may be used to strip * {@link Character#isWhitespace(int) white space} from * the beginning and end of a string. * * @return a string whose value is this string, with all leading * and trailing white space removed * * @see Character#isWhitespace(int) * * @since 11 */ public String strip()

Los ejemplos de casos para estos podrían ser:

 System.out.println("".strip()); System.out.println(" both ".strip()); System.out.println(" leading".strip()); System.out.println("trailing ".strip()); 

Si no desea utilizar el método String.trim (), entonces se puede implementar de la siguiente manera. La lógica manejará diferentes escenarios como espacio, pestaña y otros caracteres especiales.

 public static String trim(String str){ int i=0; int j = str.length(); char[] charArray = str.toCharArray(); while((i 

La matriz de destino newChars no es lo suficientemente grande como para contener los valores copiados. Debe inicializarlo a la longitud de los datos que intenta copiar (por lo tanto, longitud – 1).

Puedes usar Guava CharMatcher .

 String outputString = CharMatcher.whitespace().trimFrom(inputString); 

Nota: Esto funciona porque el espacio en blanco está todo en el BMP.