Wie viele Leerzeichen entfernt Java String.trim ()?


117

In Java habe ich einen String wie diesen:

"     content     ".

Werden String.trim()alle Leerzeichen auf diesen Seiten oder nur jeweils ein Leerzeichen entfernt?


197
An die Downvoter: Ihr Verhalten ist herablassend. Diese Frage ist detailliert und spezifisch, klar und einfach geschrieben und für mindestens einen anderen Programmierer irgendwo von Interesse. Die Leute wissen möglicherweise nicht, wo sie suchen müssen, um den Javadoc oder den Quellcode zu finden. Unsere Aufgabe ist es, ihnen zu helfen und sie nicht dafür zu verprügeln, dass sie unwissend sind.
glmxndr

14
@subtenante, du bist richtig. Ich habe sogar Leute dafür verteidigt, dass sie Google-Fragen gestellt haben. Etwas so Einfaches wie dieses sollte jedoch selbst getestet werden, und IMO sollte es NIEMALS rechtfertigen, eine Frage auf einer Q & A-Site zu veröffentlichen. Der Titel ist irreführend und das Q ist Zeitverschwendung für alle, die es lesen.
Chris

9
@ Chris: oneat gab mir die Gelegenheit, mir den Quellcode anzusehen. Ich habe viel über trim () gelernt. Ich hätte es sonst nicht getan. Jeder ist für seinen eigenen Zeitaufwand verantwortlich. oneat ist nicht dafür verantwortlich zu machen, dass wir nicht in der Lage sind, von seiner scheinbar naiven Frage zu profitieren.
glmxndr

1
@skaffman: (c) sollte "try it and see" sein und erst dann (d) auf SO fragen.
Mac

2
Diese Frage scheint nicht zum Thema zu gehören, da es sich um etwas handelt, das jeder in weniger als einer Minute im Handbuch finden UND testen sollte.
Jasper

Antworten:


168

Alle von ihnen .

Rückgabe : Eine Kopie dieser Zeichenfolge mit entferntem und nachfolgendem Leerzeichen oder diese Zeichenfolge, wenn kein führender oder nachfolgender Leerraum vorhanden ist.

~ Zitiert aus Java 1.5.0-Dokumenten

(Aber warum hast du es nicht einfach versucht und es selbst gesehen?)


1
Ich musste abstimmen, da diese Antwort nicht abdeckt, was die Dokumentation unter "Leerzeichen" versteht. Es scheint logisch, dass es dort Chararacter.isWhitespaceist, wo es wahr ist, aber das ist nicht das, was es mit "Leerzeichen" meint.
user2864740

7
@ user2864740: Diese Antwort ist nicht beabsichtigt , eine umfassende Analyse zu sein trim, isWhiteSpaceusw., oder eine Diskussion über Unklarheiten in der Java - Dokumentation; Dies ist eine einfache Antwort auf die oben gestellte Frage. Entfernt die trimMethode ein einzelnes oder mehrere Leerzeichen?
LukeH

Ich weiß, dass es nicht so ist. Ich habe abgelehnt, weil es selbst im Vorbeigehen nicht darauf hinweist. In jedem Fall kann ich meine Abstimmung nur rückgängig machen, wenn sie aktualisiert wurde (jedoch nur minimal).
user2864740

33

Aus dem Quellcode (dekompiliert):

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

Die beiden whileZeichen, die Sie sehen können, bedeuten, dass alle Zeichen, deren Unicode am Anfang und am Ende unter dem Leerzeichen liegt, entfernt werden.


27

Schreiben Sie im Zweifelsfall einen Komponententest:

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

NB : Natürlich schlägt der Test (für JUnit + Hamcrest) nicht fehl


43
Fragen Sie einen neuen Programmierer, der gerade gelernt hat, wie man ein System.out.println macht, um einen
Komponententest

26

Eine Sache, die jedoch hervorgehoben werden muss, ist, dass String.trim eine eigenartige Definition von "Leerzeichen" hat. Es werden keine Unicode-Leerzeichen entfernt, aber auch ASCII-Steuerzeichen, die Sie möglicherweise nicht als Leerzeichen betrachten.

Diese Methode kann verwendet werden, um Leerzeichen vom Anfang und Ende eines Strings abzuschneiden. Tatsächlich werden auch alle ASCII-Steuerzeichen abgeschnitten.

Wenn möglich, möchten Sie möglicherweise StringUtils.strip () von Commons Lang verwenden, das auch Unicode-Leerzeichen verarbeitet (und auch null-sicher ist).


3
Scheint ein schreckliches Versehen seitens der Designer zu sein. Und die schrecklich übertechnische Arbeitsweise der Dokumentation hilft nicht viel.
user2864740

2
Bravo! Sie haben die einfachste Frage gestellt, die jemals bei StackOverflow gestellt wurde, und etwas Intelligentes gefunden, das Sie dazu sagen können. Du bist ein Verdienst des Rennens.
Mark McKenna

3
@MarkMcKenna: Ich stelle immer wieder fest, dass diese angeblich supereinfachen Programmierfragen (Trimmen von Zeichenfolgen, Finden von Dateinamenerweiterungen usw.) immer ihre versteckten Komplexitäten haben. Das ist ein bisschen desillusionierend in Bezug auf unser Handwerk und unsere Werkzeuge.
Thilo

15

Siehe API für die String-Klasse:

Gibt eine Kopie der Zeichenfolge zurück, wobei führende und nachfolgende Leerzeichen weggelassen werden.

Leerzeichen auf beiden Seiten werden entfernt:

Beachten Sie, dass trim()die String-Instanz nicht geändert wird und ein neues Objekt zurückgegeben wird:

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

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

1
Eigentlich kann nichts die String-Instanz ändern (außer einigen schmutzigen Dingen, die die VM zum Absturz bringen könnten)
AvrDragon

13

Auf der Grundlage der Java - Dokumentation hier , die .trim()ersetzt ‚\ u0020‘ , die gemeinhin als Leerzeichen bekannt ist.

Beachten Sie jedoch, dass das '\ u00A0' ( Unicode NO-BREAK SPACE &nbsp; ) auch als Leerzeichen angesehen wird und .trim()dieses NICHT entfernt. Dies ist besonders häufig in HTML.

Um es zu entfernen, benutze ich:

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

Ein Beispiel für dieses Problem wurde hier diskutiert .


Basierend auf dem Javadoc werden führende und nachfolgende Leerzeichen entfernt, die Leerzeichen, Tabulatoren, Zeilenumbrüche für Zeilenumbrüche, Formularvorschub usw. enthalten und Zeichen ausschließen , die nicht führend oder nachfolgend sind.
Marquis von Lorne

Danke, es hilft mir zuzuteilen
Asad Haider

8

Beispiel für das trim()Entfernen von Leerzeichen durch Java :

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

AUSGABE

old = 
 This is a String.


new = This is a String.

4

Aus Java-Dokumenten (String-Klassenquelle),

/**
 * 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;
}

Beachten Sie, dass nach dem Start und der Länge die Teilstring-Methode der String-Klasse aufgerufen wird.


Wobei "Leerzeichen" "Zeichen mit Werten kleiner oder gleich \ x20" ist .. brillant.
user2864740

3

trim()entfernt alle führenden und nachfolgenden Leerzeichen. Beachten Sie jedoch, dass Ihre Zeichenfolge nicht geändert wird. trim()gibt stattdessen eine neue Zeichenfolgeninstanz zurück.


Es werden alle führenden und nachfolgenden Leerzeichen entfernt.
Marquis von Lorne

3

Wenn Ihre String-Eingabe lautet:

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

Ja, die Ausgabe lautet "abc". Aber wenn Ihre String-Eingabe ist:

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

Die Ausgabe wird This is a test so sein. Trimmen entfernt also nur Leerzeichen vor Ihrem ersten Zeichen und nach Ihrem letzten Zeichen in der Zeichenfolge und ignoriert die inneren Leerzeichen. Dies ist ein Teil meines Codes, der die integrierte StringTrimmmethode zum Optimieren der inneren Leerzeichen und zum Entfernen von Leerzeichen vor und nach Ihrem ersten und letzten Zeichen in der Zeichenfolge leicht optimiert . Ich hoffe es hilft.

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

Die ersten paar Aussagen in dieser Antwort sind einfach falsch, die Ausgabe wird nicht "abc" sein. Vielleicht vergessen Sie .trim()in der System.out.println(a);?
Arjan

2

Es werden alle Leerzeichen auf beiden Seiten entfernt.


2

Eine sehr wichtige Sache ist, dass eine Zeichenfolge, die vollständig aus "Leerzeichen" besteht, eine leere Zeichenfolge zurückgibt.

Wenn a string sSomething = "xxxxx", wo xfür Leerzeichen stehen, sSomething.trim()wird eine leere Zeichenfolge zurückgegeben.

Wenn a string sSomething = "xxAxx", wo xfür Leerzeichen stehen, sSomething.trim()wird zurückkehren A.

Wenn sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()wird zurückgegeben SomethingxxxxAndSomethingxElse, beachten Sie, dass die Anzahl der xWörter nicht geändert wird.

Wenn Sie eine ordentlich verpackte Zeichenfolge trim()mit Regex kombinieren möchten, wie in diesem Beitrag gezeigt: Wie entferne ich doppelte Leerzeichen in der Zeichenfolge mit Java? .

Ordnung ist für das Ergebnis bedeutungslos, trim()wäre aber zunächst effizienter. Ich hoffe es hilft.


2

Um nur eine Instanz für den String zu behalten, können Sie Folgendes verwenden.

str = "  Hello   ";

oder

str = str.trim();

Dann ist der Wert des strStringsstr = "Hello"



0

Javadoc for String enthält alle Details. Entfernt Leerzeichen (Leerzeichen, Tabulatoren usw.) von beiden Enden und gibt eine neue Zeichenfolge zurück.


0

Wenn Sie überprüfen möchten, was eine Methode bewirkt , können Sie BeanShell verwenden . Es ist eine Skriptsprache, die so nah wie möglich an Java ist. Im Allgemeinen wird Java mit einigen Entspannungen interpretiert. Eine weitere Option dieser Art ist die Groovy- Sprache. Beide Skriptsprachen bieten eine praktische Read-Eval-Print-Schleife, die aus interpretierten Sprachen bekannt ist. Sie können also die Konsole ausführen und einfach Folgendes eingeben:

"     content     ".trim();

Sie sehen dies "content"als Ergebnis nach dem Drücken Enter(oder Ctrl+Rin der Groovy-Konsole).


6
Um eine Methode in Java zu verstehen, sollte er eine völlig neue Sprache lernen. "Ja wirklich?"
James.garriss

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

Dies hat nichts mit der Frage zu tun.
Mark McKenna

2
@ Mark, aber aus Versehen war es das, wonach ich gesucht habe, als ich diese Frage geöffnet habe ...
Armfoot

Es ist auch sinnlos. trim()tut schon, was der repkaceAll()tun würde, wenn noch etwas zu tun wäre.
Marquis von Lorne

@EJP the replaceAll würde auch Leerzeichen in der Zeichenfolge durch ein einzelnes Leerzeichen ersetzen, während Trim nur führende und
Krishna
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.