Quanti spazi rimuoverà Java String.trim ()?


117

In Java, ho una stringa come questa:

"     content     ".

Sarà String.trim()rimuovere tutti gli spazi su questi lati o solo uno spazio su ogni?


197
Ai downvoters: il tuo comportamento è condiscendente. Questa domanda è dettagliata e specifica, scritta in modo chiaro e semplice, di interesse per almeno un altro programmatore da qualche parte. Le persone potrebbero non sapere dove cercare per trovare javadoc o il codice sorgente. Il nostro lavoro è aiutarli, non picchiarli per essere ignoranti.
glmxndr

14
@subtenante, hai ragione. Ho persino difeso le persone per aver fatto domande su Google in passato. Tuttavia, qualcosa di semplice come questo dovrebbe essere testato da solo e IMO, non dovrebbe MAI giustificare la pubblicazione di una domanda su un sito di domande e risposte. Il titolo è fuorviante e la Q è una perdita di tempo per tutti coloro che la leggono.
Chris

9
@ Chris: oneat mi ha dato l'occasione di guardare il codice sorgente. Ho imparato molto su trim (). Altrimenti non l'avrei fatto. Ognuno è responsabile della propria spesa del proprio tempo. Oneat non è da biasimare per non essere in grado di trarre profitto dalla sua domanda apparentemente ingenua.
glmxndr

1
@skaffman: (c) dovrebbe essere "provalo e vedi", e solo allora (d) chiedi SO.
Mac

2
Questa domanda sembra essere fuori tema perché riguarda qualcosa che chiunque dovrebbe essere in grado di trovare nel manuale AND test in meno di un minuto.
Jasper

Risposte:


168

Tutti loro .

Restituisce : una copia di questa stringa con lo spazio bianco iniziale e finale rimosso, o questa stringa se non ha spazi bianchi iniziali o finali.

~ Citato dai documenti Java 1.5.0

(Ma perché non l'hai semplicemente provato e visto di persona?)


1
Ho dovuto votare per difetto poiché questa risposta non copre ciò che la documentazione intende per "spazi bianchi". Sembrerebbe logico che sarebbe dove Chararacter.isWhitespaceè vero, ma non è questo che significa "spazi bianchi" ..
user2864740

7
@ user2864740: questa risposta non intende essere un'analisi completa di trim, isWhiteSpaceecc. o una discussione sulle ambiguità nei documenti Java; è una risposta semplice alla domanda specifica posta sopra, ovvero, il trimmetodo rimuove uno o più spazi?
Luca

So che non lo è. Ho votato contro perché non lo fa notare, nemmeno di sfuggita. In ogni caso, non posso annullare il mio voto a meno che non venga aggiornato (anche se in minima parte).
user2864740

33

Dal codice sorgente (decompilato):

  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);
  }

I due whileche puoi vedere significano che tutti i caratteri il cui unicode è sotto lo spazio, all'inizio e alla fine, vengono rimossi.


27

In caso di dubbio, scrivi uno unit test:

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

NB : ovviamente il test (per JUnit + Hamcrest) non fallisce


43
Chiedi a un nuovo programmatore che ha appena imparato come eseguire un System.out.println di fare un test unitario per vedere qual è il risultato ...
jaxkodex

26

Una cosa da sottolineare, tuttavia, è che String.trim ha una definizione particolare di "spazi bianchi". Non rimuove gli spazi bianchi Unicode, ma rimuove anche i caratteri di controllo ASCII che potresti non considerare spazi bianchi.

Questo metodo può essere utilizzato per tagliare gli spazi all'inizio e alla fine di una stringa; infatti, taglia anche tutti i caratteri di controllo ASCII.

Se possibile, potresti voler usare StringUtils.strip () di Commons Lang, che gestisce anche gli spazi bianchi Unicode (ed è anche null-safe).


3
Sembra una terribile svista da parte dei progettisti .. e il lavoro terribilmente tecnico della documentazione non aiuta molto.
user2864740

2
Bravo! Hai preso la domanda più semplice mai posta su StackOverflow e hai trovato qualcosa di intelligente da dire al riguardo. Sei un merito per la razza.
Mark McKenna

3
@MarkMcKenna: Continuo a scoprire che queste domande di programmazione apparentemente semplicissime (tagliare stringhe, trovare estensioni di nomi di file ecc.) Hanno sempre le loro complessità nascoste. Questo è un po 'disilluso riguardo al nostro mestiere e ai nostri strumenti.
Thilo

15

Vedi API per la classe String:

Restituisce una copia della stringa, omettendo gli spazi iniziali e finali.

Lo spazio bianco su entrambi i lati viene rimosso:

Nota che trim()non cambia l'istanza String, restituirà un nuovo oggetto:

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

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

1
in realtà nulla può cambiare l'istanza di String (tranne alcune cose sporche che potrebbero mandare in crash la VM)
AvrDragon

13

Sulla base dei documenti Java qui , .trim()sostituisce "\ u0020", comunemente noto come spazi bianchi.

Ma prendi nota, "\ u00A0" ( Unicode NO-BREAK SPACE &nbsp; ) è visto anche come uno spazio bianco e .trim()NON lo rimuoverà. Questo è particolarmente comune in HTML.

Per rimuoverlo, utilizzo:

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

Un esempio di questo problema è stato discusso qui .


Basato su Javadoc, rimuove gli spazi bianchi iniziali e finali, che includono spazio, tabulazione, ritorno a capo di nuova riga, avanzamento modulo, ... e che esclude i caratteri che non sono iniziali o finali.
Marchese di Lorne

Grazie, mi aiuta ad assegnare
Asad Haider

8

Esempio di Java che trim()rimuove gli spazi:

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);
    }
}

PRODUZIONE

old = 
 This is a String.


new = This is a String.

4

Da java docs (sorgente classe 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;
}

Si noti che dopo aver ottenuto inizio e lunghezza chiama il metodo della sottostringa della classe String.


Dove "spazi bianchi" è "caratteri con valori minori o uguali a \ x20" .. brillante.
user2864740

3

trim()rimuoverà tutti gli spazi iniziali e finali. Ma attenzione: la tua stringa non è cambiata. trim()restituirà invece una nuova istanza di stringa.


Rimuoverà tutti gli spazi bianchi
Marchese di Lorne

3

Se il tuo input String è:

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

Sì, l'output sarà "abc"; Ma se il tuo input String è:

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

L'output sarà This is a test Quindi trim rimuove solo gli spazi prima del primo carattere e dopo l'ultimo carattere nella stringa e ignora gli spazi interni. Questo è un pezzo del mio codice che ottimizza leggermente il Stringmetodo di taglio incorporato rimuovendo gli spazi interni e rimuove gli spazi prima e dopo il tuo primo e ultimo carattere nella stringa. Spero che sia d'aiuto.

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);
  }

Le prime due affermazioni in questa risposta sono chiaramente sbagliate, l'output non sarà "abc". Forse si è dimenticato di .trim()la System.out.println(a);?
Arjan

2

Rimuoverà tutti gli spazi su entrambi i lati.


2

Una cosa molto importante è che una stringa composta interamente da "spazi bianchi" restituirà una stringa vuota.

se a string sSomething = "xxxxx", dove xsta per spazi bianchi, sSomething.trim()restituirà una stringa vuota.

se a string sSomething = "xxAxx", dove xsta per spazi bianchi, sSomething.trim()tornerà A.

se sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()tornerà SomethingxxxxAndSomethingxElse, nota che il numero di xparole tra le parole non è alterato.

Se vuoi che una stringa ordinata in pacchetti si combini trim()con regex come mostrato in questo post: Come rimuovere gli spazi bianchi duplicati nella stringa usando Java? .

L'ordine non ha senso per il risultato, ma trim()prima sarebbe più efficiente. Spero che sia d'aiuto.


2

Per mantenere solo un'istanza per la stringa, è possibile utilizzare quanto segue.

str = "  Hello   ";

o

str = str.trim();

Quindi il valore della strstringa saràstr = "Hello"



0

Javadoc per String ha tutti i dettagli. Rimuove lo spazio bianco (spazio, tabulazioni, ecc.) Da entrambe le estremità e restituisce una nuova stringa.


0

Se vuoi controllare cosa farà qualche metodo, puoi usare BeanShell . È un linguaggio di scripting progettato per essere il più vicino possibile a Java. In generale viene interpretato Java con qualche rilassamento. Un'altra opzione di questo tipo è il linguaggio Groovy . Entrambi questi linguaggi di scripting forniscono un comodo loop Read-Eval-Print conosciuto dai linguaggi interpretati. Quindi puoi eseguire la console e digitare semplicemente:

"     content     ".trim();

Vedrai "content"come risultato dopo aver premuto Enter(o Ctrl+Rnella console Groovy).


6
Quindi, per capire un metodo in Java, dovrebbe imparare un linguaggio completamente nuovo. Veramente?
james.garriss

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

Questo non è correlato alla domanda.
Mark McKenna

2
@Mark ma accidentalmente era quello che stavo cercando quando ho aperto questa domanda ...
Armfoot

È anche inutile. trim()fa già quello che repkaceAll()farebbe, se gli fosse rimasto qualcosa da fare.
Marchese di Lorne

@EJP il replaceAll sostituirà anche gli spazi bianchi nella stringa con un singolo spazio, mentre il trim gestirà solo gli spazi iniziali e finali
Krishna
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.