Java String.trim()はいくつのスペースを削除しますか?


117

Javaでは、私はこのような文字列を持っています:

"     content     ".

ウィルString.trim()各上のすべてのこれらの側面にスペースまたは一つだけのスペースを削除しますか?


197
反対投票者へ:あなたの行動は子孫です。この質問は詳細で具体的で、明確かつ簡単に書かれており、どこかで少なくとも1人の他のプログラマが興味を持っています。人々はjavadocやソースコードをどこで探すべきかわからないかもしれません。私たちの仕事は彼らを助けることであり、無知であることを彼らに打ち付けるのではありません。
glmxndr

14
@subtenante、あなたは正しいです。私は以前にもグーグルっぽい質問をしたことで人々を守ったことがあります。ただし、これだけの簡単なものは自分でテストする必要があり、IMOは、Q&Aサイトに質問を投稿することはできません。タイトルは誤解を招くものであり、Qはそれを読んだすべての人にとって時間の無駄です。
Chris

9
@Chris:oneatは私にソースコードを見る機会を与えてくれました。私はtrim()について多くを学びました。それ以外はありません。誰もが自分の時間を費やす責任があります。oneatは、私たちが彼の外見上無邪気な質問から利益を得ることができないために非難されるべきではありません。
glmxndr 2010

1
@skaffman:(c)「試して見る」である必要があり、そのときだけ(d)SOで尋ねます。
Mac

2
この質問はトピックから外れているように見えます。それは、誰もが手動で見つけて、1分以内にテストできるはずの何かについてのものだからです。
Jasper

回答:


168

それらのすべて

戻り値:先頭と末尾の空白を削除したこの文字列のコピー。先頭または末尾に空白がない場合はこの文字列。

〜Java 1.5.0ドキュメントから引用

(しかし、なぜそれを試して自分の目で確かめなかったのですか?)


1
この回答は「ホワイトスペース」によるドキュメントの意味をカバーしていないため、私は反対票を投じなければなりませんでした。それがどこにあるのかは論理的に思えChararacter.isWhitespaceますが、それは「空白」が意味するものではありません ..
user2864740

7
@ user2864740:この回答はtrimisWhiteSpaceなどの包括的な分析や、Javaドキュメントのあいまいさの説明を意図したものではありません。これは、上記の特定の質問に対する簡単な答えです。つまり、このtrimメソッドは単一のスペースまたは複数のスペースを削除しますか?
LukeH 2013

私はそうではないことを知っています。私は、たとえそれがそうであっても指摘できないため、反対票を投じました。いずれにせよ、(最低限)更新されない限り、投票を取り消すことはできません。
user2864740

33

ソースコードから(逆コンパイル):

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

表示されている2つwhileは、最初と最後に、Unicodeがスペース文字の下にあるすべての文字が削除されていることを意味します。


27

疑わしい場合は、単体テストを作成します。

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

注意:もちろん、テスト(JUnit + Hamcrestの場合)は失敗しません


43
System.out.printlnを実行してユニットテストを実行し、結果を確認する方法を学んだばかりの新しいプログラマーに尋ねます...
jaxkodex

26

ただし、String.trimには「空白」の独特の定義があることを指摘しておく必要があります。Unicodeの空白は削除されませんが、空白とは見なされない可能性のあるASCII制御文字も削除されます。

このメソッドは、文字列の最初と最後から空白を削除するために使用できます。実際、すべてのASCII制御文字もトリミングします。

可能であれば、Commons LangのStringUtils.strip()を使用することもできます。これは、Unicodeの空白も処理します(ヌルセーフでもあります)。


3
設計者部分のひどい見落としのようであり、ドキュメントの非常に過度に技術的な作業はあまり役に立ちません。
user2864740 2013年

2
ブラボー!あなたはStackOverflowでこれまでに尋ねられた最も単純な質問を取り、それについて言うためにインテリジェントな何かを見つけました。あなたはレースの功績です。
マークマッケンナ

3
@MarkMcKenna:私はこれらの非常に単純なプログラミングの質問(文字列のトリミング、ファイル名拡張子の検索など)には常に隠れた複雑さがあることに気づき続けています。それは私たちの技術と道具について少し幻滅しています。
Thilo

15

StringクラスのAPIを参照してください:

文字列のコピーを返します。先頭と末尾の空白は省略されています。

両側の空白が削除されます。

trim()Stringインスタンスは変更しないことに注意してください。新しいオブジェクトが返されます。

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

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

1
実際には、Stringインスタンスを変更することはできません(VMをクラッシュさせる可能性があるいくつかのダーティなものを除く)
AvrDragon

13

Javaのドキュメントに基づいて、ここで.trim()一般的に空白として知られている置き換え「\ U0020」。

ただし、 '\ u00A0'(Unicode NO-BREAK SPACE &nbsp;)は空白としても認識され、.trim()これを削除しないことに注意してください。これはHTMLで特に一般的です。

それを削除するには、私は使用します:

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

この問題の例については、ここで説明しました


Javadocに基づいて、スペース、タブ、改行復帰、フォームフィードなどを含む先頭と末尾の空白を削除し、先頭または末尾にない文字を除外します。
ローンの侯爵2014年

おかげで、それは私を割り当てるのに役立ちます
Asad Haider

8

trim()スペースを削除する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);
    }
}

出力

old = 
 This is a String.


new = This is a String.

4

java docs(String class source)から、

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

開始と長さを取得した後、Stringクラスのsubstringメソッドを呼び出すことに注意してください。


ここで、「空白」は、「\ x20以下の値を持つ文字」です。
user2864740 2013年

3

trim()先頭と末尾の空白がすべて削除されます。ただし、注意してください:文字列は変更されません。trim()代わりに新しい文字列インスタンスを返します。


先頭と末尾の空白を
ローン侯爵2014年

3

文字列入力が次の場合:

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

はい、出力は「abc」になります。しかし、あなたの文字列入力が:

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

そのため、出力は次のようになりThis is a test ます。トリムでは、文字列の最初の文字の前と最後の文字の後のスペースのみが削除され、内部のスペースは無視されます。これは、組み込みのStringトリムメソッドをわずかに最適化して内部のスペースを削除し、文字列の最初と最後の文字の前後のスペースを削除する私のコードの一部です。それが役に立てば幸い。

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

この回答の最初のいくつかの文は明らかに間違ってます。出力は「abc」にはなりません。たぶん、あなた.trim()System.out.println(a);
アルジャン


2

非常に重要なことの1つは、完全に「空白」で構成される文字列が空の文字列を返すことです。

あればstring sSomething = "xxxxx"、どこxの空白を表し、sSomething.trim()空の文字列を返します。

あればstring sSomething = "xxAxx"、どこxの空白を表し、sSomething.trim()返されますA

がを返す場合sSomething ="xxSomethingxxxxAndSomethingxElsexxx"、単語間の数は変更されないsSomething.trim()ことSomethingxxxxAndSomethingxElseに注意してxください。

trim()この投稿に示すように、きちんとパケット化された文字列を正規表現と組み合わせる場合:Javaを使用して文字列内の重複する空白を削除する方法は?

順序は結果にとって意味trim()がありませんが、最初はより効率的です。それが役に立てば幸い。


2

Stringのインスタンスを1つだけ保持するには、以下を使用できます。

str = "  Hello   ";

または

str = str.trim();

次に、str文字列の値は、str = "Hello"



0

StringのJavadocにすべての詳細があります。両端から空白(スペース、タブなど)を削除し、新しい文字列を返します。


0

なんらかの方法で何が行われるかを確認したい場合は、BeanShellを使用できます。これは、Javaにできる限り近づくように設計されたスクリプト言語です。一般的に言えば、それはJavaをいくつかの緩和とともに解釈します。この種の別のオプションは、Groovy言語です。これらのスクリプト言語はどちらも、インタープリター言語からわかる便利なRead-Eval-Printループを提供します。したがって、コンソールを実行して次のように入力できます。

"     content     ".trim();

"content"押すとEnter(またはCtrl+RGroovyコンソールで)結果が表示されます。


6
したがって、Javaのメソッドを理解するには、まったく新しい言語を学ぶ必要があります。本当に?
james.garriss 2013

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

これは質問とは関係ありません。
マークマッケナ

2
@Markですが、この質問を開いたときに誤って探していたものでした...
Armfoot

それもまた無意味です。実行することが残っていればtrim()repkaceAll()はすでに実行することを実行します。
ローンの侯爵2014年

@EJP replaceAllは文字列内の空白も単一のスペースに置き換えますが、trimは先頭と末尾のスペースのみを処理します
クリシュナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.