2010-02-04 644 views
119

En Java, tengo una cadena como esta:¿Cuántos espacios eliminará Java String.trim()?

"  content  ". 

Will String.trim() quitan todos los espacios en los lados o sólo un espacio en cada uno?

+196

Para los downvoters: su comportamiento es condescendiente. Esta pregunta es detallada y específica, escrita de manera clara y simple, de interés para al menos otro programador en alguna parte. La gente puede no saber dónde buscar para encontrar el javadoc o el código fuente. Nuestro trabajo es ayudarlos, no criticarlos por ser ignorantes. – glmxndr

+14

@subtenante, estás en lo correcto. Incluso he defendido a personas por hacer preguntas de google antes. Sin embargo, algo tan simple como esto debe ser probado por uno mismo, y la OMI, NUNCA debe garantizar la publicación de una pregunta en un sitio de preguntas y respuestas. El título es engañoso y la Q es una pérdida de tiempo para todos los que lo leen. – Chris

+9

@Chris: oneat me dio la oportunidad de ver el código fuente. Aprendí mucho sobre trim(). No lo hubiera hecho de otra manera. Todos son responsables de sus propios gastos de su tiempo. no se debe culpar a oneat de que no podamos sacar provecho de su pregunta aparentemente ingenua. – glmxndr

Respuesta

170

All of them.

devoluciones: una copia de esta cadena con iniciales y finales espacio en blanco eliminado, o esta cadena si no tiene ningún principio o al final de espacio en blanco.

~ Citado de Java 1.5.0 docs

(Pero ¿por qué no acaba de probarlo y ver por sí mismo?)

+1

Tuve que votar abajo ya que esta respuesta no cubre lo que la documentación significa por "espacio en blanco". Parecería lógico que sea donde 'Chararacter.isWhitespace' es verdadero, pero eso es * no * lo que significa por" espacio en blanco ".. – user2864740

+7

@ user2864740: Esta respuesta no pretende ser un análisis exhaustivo de' trim ',' isWhiteSpace', etc., o una discusión de ambigüedades en los documentos de Java; es una respuesta directa a la pregunta específica anterior, es decir, ¿el método 'trim 'elimina un solo espacio o varios espacios? – LukeH

+0

Sé que no es así. He votado negativamente porque no lo señala, incluso de pasada. En cualquier caso, no puedo deshacer mi voto a menos que se actualice (aunque sea mínimamente). – user2864740

2

Eliminará todos los espacios en ambos lados.

3

trim() eliminará todos los espacios en blanco iniciales y finales. Pero ten en cuenta: tu cadena no ha cambiado. trim() devolverá una nueva instancia de cadena en su lugar.

+0

Eliminará todos los espacios en blanco iniciales y finales *. – EJP

0

Trim() funciona tanto para lados.

33

A partir del código fuente (decompilados):

public String trim() 
    { 
    int i = this.count; 
    int j = 0; 
    int k = this.offset; 
    char[] arrayOfChar = this.value; 
    while ((j < i) && (arrayOfChar[(k + j)] <= ' ')) 
     ++j; 
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' ')) 
     --i; 
    return (((j > 0) || (i < this.count)) ? substring(j, i) : this); 
    } 

Los dos while que se puede ver significa que todos los caracteres Unicode cuyos está por debajo del carácter de espacio de, al principio y al final, se eliminan.

27

En caso de duda, escribir una prueba unitaria:

@Test 
public void trimRemoveAllBlanks(){ 
    assertThat(" content ".trim(), is("content")); 
} 

NB: por supuesto la prueba (por JUnit + Hamcrest) no se falla

+42

Pregunte a un nuevo programador que acaba de aprender cómo hacer un System.out.println para hacer una prueba unitaria para ver cuál es el resultado ... – jaxkodex

15

Ver API para la clase String:

Devuelve una copia de la cadena, con el espacio en blanco inicial y final omitido.

El espacio en blanco en ambos lados se retira:

Tenga en cuenta que trim() no cambia la instancia String, devolverá un nuevo objeto:

String original = " content "; 
String withoutWhitespace = original.trim(); 

// original still refers to " content " 
// and withoutWhitespace refers to "content" 
+1

en realidad, nada puede cambiar la instancia de String (excepto algunas cosas sucias que podrían bloquear la VM) – AvrDragon

0

Javadoc para la cadena tiene todos los detalles. Elimina el espacio en blanco (espacio, pestañas, etc.) de ambos extremos y devuelve una nueva cadena.

0

Si desea comprobar qué hará algún método, puede usar BeanShell. Es un lenguaje de scripting diseñado para estar lo más cerca posible de Java. En general, se interpreta Java con algunas relajaciones. Otra opción de este tipo es Groovy. Ambos lenguajes de scripting proporcionan un conveniente conocimiento del ciclo Read-Eval-Print a partir de los idiomas interpretados.Para que pueda ejecutar la consola y teclee:

"  content  ".trim(); 

Verás "content" como resultado después de pulsar Enter (o Ctrl+R en la consola maravillosa).

+5

Para entender un método en Java, debe aprender un idioma completamente nuevo. De Verdad? –

25

Una cosa para señalar, sin embargo, es que String.trim tiene una definición peculiar de "espacio en blanco". No elimina el espacio en blanco Unicode, sino que también elimina los caracteres de control ASCII que no considere espacios en blanco.

Este método se puede utilizar para recortar el espacio en blanco desde el principio y el final de una cadena; de hecho, recorta todos los caracteres de control ASCII también.

Si es posible, puede utilizar Commons Lang's StringUtils.strip(), que también maneja el espacio en blanco Unicode (y también es nulo).

+2

Parece un descuido terrible en la parte de los diseñadores ... y el trabajo excesivamente técnico de la documentación no ayuda mucho. – user2864740

+1

¡Bravo! Tomó la pregunta más simple que jamás se haya hecho en StackOverflow y encontró algo inteligente que decir al respecto. Eres un crédito para la carrera. –

+3

@MarkMcKenna: sigo encontrando que estas preguntas de programación supuestamente súper simples (recorte de cadenas, búsqueda de extensiones de nombre de archivo, etc.) * siempre * tienen sus complejidades ocultas. Eso es un poco decepcionante sobre nuestra artesanía y herramientas. – Thilo

2

Una cosa muy importante es que una cadena hecha completamente de "espacios en blanco" devolverá una cadena vacía.

si string sSomething = "xxxxx", donde x representan espacios en blanco, sSomething.trim() devolverá una cadena vacía.

si es string sSomething = "xxAxx", donde x representan espacios en blanco, sSomething.trim() devolverá A.

si sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim() volverá SomethingxxxxAndSomethingxElse, el aviso de que el número de x entre las palabras no se altera.

Si desea una secuencia empaquetada ordenada, combine trim() con expresiones regulares como se muestra en esta publicación: How to remove duplicate white spaces in string using Java?.

El pedido no tiene sentido para el resultado, pero trim() primero sería más eficiente. Espero eso ayude.

-1
String formattedStr=unformattedStr; 
formattedStr=formattedStr.trim().replaceAll("\\s+", " "); 
+0

Esto no está relacionado con la pregunta. –

+1

@Mark pero accidentalmente era lo que estaba buscando cuando abrí esta pregunta ... – Armfoot

+0

Tampoco tiene sentido. 'trim()' ya hace lo que haría 'repkaceAll()', si quedaba algo por hacer. – EJP

4

a partir de documentos de Java (fuente clase String),

/** 
* Returns a copy of the string, with leading and trailing whitespace 
* omitted. 
* <p> 
* If this <code>String</code> object represents an empty character 
* sequence, or the first and last characters of character sequence 
* represented by this <code>String</code> object both have codes 
* greater than <code>'&#92;u0020'</code> (the space character), then a 
* reference to this <code>String</code> object is returned. 
* <p> 
* Otherwise, if there is no character with a code greater than 
* <code>'&#92;u0020'</code> in the string, then a new 
* <code>String</code> object representing an empty string is created 
* and returned. 
* <p> 
* Otherwise, let <i>k</i> be the index of the first character in the 
* string whose code is greater than <code>'&#92;u0020'</code>, and let 
* <i>m</i> be the index of the last character in the string whose code 
* is greater than <code>'&#92;u0020'</code>. A new <code>String</code> 
* object is created, representing the substring of this string that 
* begins with the character at index <i>k</i> and ends with the 
* character at index <i>m</i>-that is, the result of 
* <code>this.substring(<i>k</i>,&nbsp;<i>m</i>+1)</code>. 
* <p> 
* This method may be used to trim whitespace (as defined above) from 
* the beginning and end of a string. 
* 
* @return A copy of this string with leading and trailing white 
*   space removed, or this string if it has no leading or 
*   trailing white space. 
*/ 
public String trim() { 
int len = count; 
int st = 0; 
int off = offset;  /* avoid getfield opcode */ 
char[] val = value; /* avoid getfield opcode */ 

while ((st < len) && (val[off + st] <= ' ')) { 
    st++; 
} 
while ((st < len) && (val[off + len - 1] <= ' ')) { 
    len--; 
} 
return ((st > 0) || (len < count)) ? substring(st, len) : this; 
} 

Tenga en cuenta que después de conseguir inicio y duración de la llama al método subcadena de clase String.

+0

Donde "espacio en blanco" es "caracteres con valores menores o iguales a \ x20" .. brillantent. – user2864740

13

Según los documentos de Java here, el .trim() reemplaza '\ u0020' que se conoce comúnmente como espacio en blanco.

Pero tenga en cuenta que el '\ u00A0' (Unicode NO-BREAK SPACE&nbsp;) también se ve como un espacio en blanco, y .trim() NO eliminará esto. Esto es especialmente común en HTML.

Para eliminarlo, que utilizo:

tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", ""); 

Un ejemplo de este problema se discutió here.

+0

Basado en el Javadoc, elimina * espacio en blanco inicial y final, * que incluye espacio, pestaña, retorno de carro de nueva línea, avance de formulario, ... y * que * excluye * caracteres que no están al principio o al final. – EJP

+0

Gracias, me ayuda a adjudicar –

8

Ejemplo de Java trim() espacios eliminación:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     String str = "\n\t This is be trimmed.\n\n"; 

     String newStr = str.trim();  //removes newlines, tabs and spaces. 

     System.out.println("old = " + str); 
     System.out.println("new = " + newStr); 
    } 
} 

SALIDA

old = 
This is a String. 


new = This is a String. 
2

Para mantener sólo una instancia de la cadena, se puede utilizar el siguiente.

str = " Hello "; 

o

str = str.trim(); 

A continuación, el valor de la str cadena, será str = "Hello"

3

Si la entrada de cuerdas es:

String a = " abc "; 
System.out.println(a); 

Sí, la salida será " a B C"; Pero si su entrada es de cadena:

String b = " This is a test " 
System.out.println(b); 

salida será This is a test tan esbelta sólo elimina los espacios antes de su primer carácter y después de su último carácter de la cadena y hace caso omiso de los espacios interiores. Esta es una parte de mi código que optimiza ligeramente el método de recorte incorporado String eliminando los espacios interiores y elimina espacios antes y después de su primer y último carácter en la cadena. Espero eso ayude.

public static String trim(char [] input){ 
    char [] output = new char [input.length]; 
    int j=0; 
    int jj=0; 
    if(input[0] == ' ') { 
     while(input[jj] == ' ') 
      jj++;  
    } 
    for(int i=jj; i<input.length; i++){ 
     if(input[i] !=' ' || (i==(input.length-1) && input[input.length-1] == ' ')){ 
     output[j]=input[i]; 
     j++; 
     } 
     else if (input[i+1]!=' '){ 
     output[j]=' '; 
     j++; 
     }  
    } 
    char [] m = new char [j]; 
    int a=0; 
    for(int i=0; i<m.length; i++){ 
     m[i]=output[a]; 
     a++; 
    } 
    return new String (m); 
    } 
+0

Las primeras declaraciones en esta respuesta son completamente incorrectas, la salida * no * será "abc". Quizás se olvidó de '.trim()' en 'System.out.println (a);'? – Arjan

Cuestiones relacionadas