Berapa banyak spasi yang akan dihapus Java String.trim ()?

117

Di Java, saya memiliki String seperti ini:

"     content     ".

Akankah String.trim()menghapus semua spasi di sisi ini atau hanya satu spasi di masing-masing?

oneat
sumber
197
Untuk para downvoters: perilaku Anda merendahkan. Pertanyaan ini terperinci dan spesifik, ditulis dengan jelas dan sederhana, yang menarik setidaknya satu programmer lain di suatu tempat. Orang mungkin tidak tahu ke mana harus mencari javadoc atau kode sumber. Tugas kita adalah membantu mereka, bukan menyalahkan mereka karena tidak peduli.
glmxndr
14
@ subtenante, Anda benar. Saya bahkan pernah membela orang-orang karena mengajukan pertanyaan tentang Google. Namun, sesuatu yang sederhana seperti ini harus diuji sendiri, dan IMO, TIDAK PERNAH menjamin untuk memposting pertanyaan di situs Tanya Jawab. Judulnya menyesatkan dan Q hanya membuang-buang waktu bagi semua yang membacanya.
Chris
9
@ Chris: oneat memberi saya kesempatan untuk melihat kode sumber. Saya belajar banyak tentang trim (). Saya tidak akan memiliki sebaliknya. Setiap orang bertanggung jawab untuk menghabiskan waktunya sendiri. oneat tidak bisa disalahkan karena kita tidak bisa mendapatkan keuntungan dari pertanyaannya yang tampaknya naif.
glmxndr
1
@skaffman: (c) harus "coba dan lihat", dan hanya kemudian (d) bertanya di SO.
Mac
2
Pertanyaan ini tampaknya di luar topik karena ini tentang sesuatu yang seharusnya dapat ditemukan oleh siapa pun di manual DAN tes dalam waktu kurang dari satu menit.
Jasper

Jawaban:

168

Semuanya .

Mengembalikan : Salinan string ini dengan spasi kosong di depan dan di belakangnya dihilangkan, atau string ini jika tidak ada spasi putih di depan atau di belakangnya.

~ Dikutip dari Java 1.5.0 docs

(Tapi kenapa kamu tidak mencobanya dan melihat sendiri?)

LukeH
sumber
1
Saya harus menolak karena jawaban ini tidak mencakup apa yang dimaksud dengan dokumentasi dengan "spasi". Tampaknya logis bahwa ini akan menjadi tempat Chararacter.isWhitespaceyang benar, tetapi bukan itu yang dimaksud dengan "spasi" ..
pengguna2864740
7
@ user2864740: Jawaban ini tidak dimaksudkan sebagai analisis yang komprehensif trim, isWhiteSpacedll, atau diskusi tentang ambiguitas dalam dokumen Java; ini adalah jawaban langsung untuk pertanyaan spesifik yang ditanyakan di atas - yaitu, apakah trimmetode ini menghapus satu spasi atau beberapa spasi?
LukeH
Saya tahu itu tidak benar. Saya memilih turun karena gagal menunjukkan hal itu, bahkan secara sepintas. Bagaimanapun, saya tidak dapat membatalkan pilihan saya kecuali telah diperbarui (betapapun minimalnya).
pengguna2864740
33

Dari kode sumber (didekompilasi):

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

Dua whileyang dapat Anda lihat berarti semua karakter yang unicode-nya berada di bawah karakter spasi, di awal dan akhir, telah dihapus.

glmxndr
sumber
27

Jika ragu, tulis tes unit:

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

NB : tentu saja pengujian (untuk JUnit + Hamcrest) tidak gagal

dfa
sumber
43
Tanyakan kepada programmer baru yang baru saja mempelajari cara melakukan System.out.println untuk melakukan pengujian unit untuk melihat apa hasilnya ...
jaxkodex
26

Satu hal yang perlu diperhatikan, adalah bahwa String.trim memiliki definisi khusus dari "spasi". Ini tidak menghapus spasi kosong Unicode, tetapi juga menghapus karakter kontrol ASCII yang mungkin tidak Anda anggap spasi kosong.

Metode ini dapat digunakan untuk memangkas spasi dari awal dan akhir string; bahkan, itu memangkas semua karakter kontrol ASCII juga.

Jika memungkinkan, Anda mungkin ingin menggunakan StringUtils.strip () Commons Lang, yang juga menangani whitespace Unicode (dan juga aman untuk null).

Thilo
sumber
3
Sepertinya ada kekeliruan yang buruk di pihak desainer .. dan dokumentasi yang terlalu teknis tidak banyak membantu.
pengguna2864740
2
Bravo! Anda mengambil pertanyaan paling sederhana yang pernah ditanyakan di StackOverflow dan menemukan sesuatu yang cerdas untuk dikatakan tentangnya. Anda adalah penghargaan untuk balapan tersebut.
Mark McKenna
3
@MarkMcKenna: Saya terus menemukan bahwa pertanyaan pemrograman yang seharusnya sangat sederhana ini (memotong string, menemukan ekstensi nama file, dll.) Selalu memiliki kerumitan tersembunyi. Itu sedikit mengecewakan tentang kerajinan dan alat kami.
Thilo
15

Lihat API untuk kelas String:

Mengembalikan salinan string, dengan spasi kosong di depan dan di belakangnya dihilangkan.

Ruang kosong di kedua sisi dihapus:

Perhatikan bahwa trim()tidak mengubah instance String, itu akan mengembalikan objek baru:

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

 // original still refers to "  content  "
 // and withoutWhitespace refers to "content"
Juha Syrjälä
sumber
1
sebenarnya tidak ada yang dapat mengubah instance String (kecuali beberapa hal kotor yang dapat merusak VM)
AvrDragon
13

Berdasarkan dokumen Java di sini , .trim()penggantian '\ u0020' yang umumnya dikenal sebagai spasi.

Tapi perhatikan, '\ u00A0' ( Unicode NO-BREAK SPACE &nbsp; ) juga terlihat sebagai spasi, dan .trim()TIDAK akan menghapusnya. Ini sangat umum di HTML.

Untuk menghapusnya, saya menggunakan:

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

Contoh masalah ini dibahas di sini .

Britc
sumber
Berdasarkan Javadoc, ini menghapus spasi kosong di depan dan di belakang, yang mencakup spasi, tab, baris baru kembali, umpan formulir, ... dan yang mengecualikan karakter yang tidak berada di depan atau di belakang.
Marquis dari Lorne
Terima kasih, ini membantu saya membagikan
Asad Haider
8

Contoh Java trim()menghapus spasi:

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

KELUARAN

old = 
 This is a String.


new = This is a String.
Unmesha SreeVeni
sumber
4

Dari dokumen java (sumber kelas 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;
}

Perhatikan bahwa setelah memulai dan memanjang itu memanggil metode substring dari kelas String.

Prateek
sumber
Di mana "spasi" adalah "karakter dengan nilai kurang dari atau sama dengan \ x20" .. cemerlang.
pengguna2864740
3

trim()akan menghapus semua kosong di depan dan di belakang. Namun berhati-hatilah: string Anda tidak berubah. trim()akan mengembalikan contoh string baru sebagai gantinya.

tangens
sumber
Ini akan menghapus semua spasi kosong di depan
Marquis dari Lorne
3

Jika input String Anda adalah:

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

Ya, keluarannya adalah, "abc"; Tetapi jika input String Anda adalah:

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

Output akan This is a test Jadi trim hanya menghapus spasi sebelum karakter pertama Anda dan setelah karakter terakhir Anda dalam string dan mengabaikan spasi dalam. Ini adalah bagian dari kode saya yang sedikit mengoptimalkan Stringmetode trim bawaan menghapus spasi dalam dan menghapus spasi sebelum dan sesudah karakter pertama dan terakhir Anda dalam string. Semoga membantu.

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);
  }
Farah Nazifa
sumber
Beberapa pernyataan pertama dalam jawaban ini salah, keluaran tidak akan menjadi "abc". Mungkin Anda lupa .trim()di System.out.println(a);?
Arjan
2

Ini akan menghapus semua ruang di kedua sisi.

Ravia
sumber
2

Satu hal yang sangat penting adalah bahwa string yang seluruhnya terbuat dari "spasi putih" akan mengembalikan string kosong.

jika a string sSomething = "xxxxx", di mana xberarti spasi putih, sSomething.trim()akan mengembalikan string kosong.

jika a string sSomething = "xxAxx", di mana xberarti ruang putih, sSomething.trim()akan kembali A.

jika sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()akan kembali SomethingxxxxAndSomethingxElse, perhatikan bahwa jumlah xantara kata tidak diubah.

Jika Anda ingin string yang dikemas rapi digabungkan trim()dengan regex seperti yang ditunjukkan di posting ini: Bagaimana cara menghapus duplikat spasi putih dalam string menggunakan Java? .

Urutan tidak ada artinya untuk hasil tetapi trim()pertama akan lebih efisien. Semoga membantu.

rciafardone.dll
sumber
2

Untuk menyimpan hanya satu contoh untuk String, Anda dapat menggunakan yang berikut ini.

str = "  Hello   ";

atau

str = str.trim();

Maka nilai strString, akan menjadistr = "Hello"

Angelos P.
sumber
0

Trim () berfungsi untuk kedua sisi.

ZeissS
sumber
0

Javadoc untuk String memiliki semua detailnya. Menghapus spasi (spasi, tab, dll) dari kedua ujung dan mengembalikan string baru.

fastcodejava.dll
sumber
0

Jika Anda ingin memeriksa metode apa yang akan dilakukan, Anda dapat menggunakan BeanShell . Ini adalah bahasa scripting yang dirancang sedekat mungkin dengan Java. Secara umum itu diartikan Jawa dengan beberapa relaksasi. Pilihan lain dari jenis ini adalah bahasa Groovy . Kedua bahasa skrip ini menyediakan loop Baca-Evaluasi-Cetak yang mudah diketahui dari bahasa yang ditafsirkan. Jadi Anda dapat menjalankan konsol dan cukup mengetik:

"     content     ".trim();

Anda akan melihat "content"hasilnya setelah menekan Enter(atau Ctrl+Rdi konsol Groovy).

Rorick
sumber
6
Jadi untuk memahami metode di Jawa, dia harus belajar bahasa yang sama sekali baru. Betulkah?
james.garriss
0
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");
MIke
sumber
Ini tidak terkait dengan pertanyaan itu.
Mark McKenna
2
@Mark tetapi secara tidak sengaja itulah yang saya cari ketika saya membuka pertanyaan ini ...
Armfoot
Itu juga tidak ada gunanya. trim()sudah melakukan apa yang repkaceAll()akan dilakukan, jika masih ada yang tersisa untuk dilakukan.
Marquis dari Lorne
@EJP the replaceAll juga akan mengganti spasi putih DI string dengan satu spasi, sementara trim hanya akan menangani spasi di depan dan di belakang
Krishna