Java String.trim () kaç tane boşluk kaldıracak?


117

Java'da şöyle bir String var:

"     content     ".

String.trim()Bu taraflardaki tüm boşlukları mı yoksa her birindeki tek bir alanı mı kaldıracak?


197
Olumsuz oy verenlere: davranışınız küçümseyici. Bu soru ayrıntılı ve özeldir, açık ve basit bir şekilde yazılmıştır ve bir yerdeki en az bir başka programcıyı ilgilendirir. İnsanlar javadoc'u veya kaynak kodunu bulmak için nereye bakacaklarını bilemeyebilir. Bizim işimiz onlara yardım etmek, cahil oldukları için onları dövmek değil.
glmxndr

14
@subtenante, haklısın. Daha önce insanların google'ca sorular sorduğunu bile savundum. Bununla birlikte, bu kadar basit bir şey kendi başına test edilmelidir ve IMO, ASLA bir Soru-Cevap sitesine soru göndermeyi garanti etmemelidir. Başlık yanıltıcıdır ve Q, onu okuyan herkes için zaman kaybıdır.
Chris

9
@Chris: oneat bana kaynak koduna bakma fırsatı verdi. Trim () hakkında çok şey öğrendim. Aksi taktirde olmazdım. Herkes kendi zamanını harcamaktan sorumludur. oneat, görünüşte saf sorusundan kar elde edemediğimiz için suçlanmamalıdır.
glmxndr

1
@skaffman: (c) "dene ve gör" olmalı ve ancak o zaman (d) SO konusunda sormalı.
Mac

2
Bu soru konu dışı gibi görünüyor çünkü herkesin kılavuzda bulabileceği VE bir dakikadan kısa bir sürede test edebileceği bir konuyla ilgili.
Jasper

Yanıtlar:


168

Hepsi .

Döndürür : Baştaki ve sondaki beyaz boşluk kaldırılmış bu dizenin bir kopyası veya başında veya sonunda beyaz boşluk yoksa bu dizenin bir kopyası.

~ Java 1.5.0 belgelerinden alıntılanmıştır

(Ama neden denemedin ve kendin görmedin?)


1
Bu yanıt belgelerin "boşluk" ile ne anlama geldiğini kapsamadığı için olumsuz oy kullanmak zorunda kaldım. Nerede Chararacter.isWhitespacedoğru olduğu mantıklı görünüyor , ancak "boşluk" ile
kastettiği

7
@ user2864740: Bu yanıtın kapsamlı bir analizi trim, isWhiteSpacevb. veya Java belgelerindeki belirsizliklerin tartışılması amaçlanmamıştır; yukarıda sorulan belirli soruya basit bir cevaptır - yani, trimyöntem tek bir boşluğu mu yoksa birden fazla boşluğu mu kaldırıyor?
LukeH

Öyle olmadığını biliyorum. Olumsuz oy verdim çünkü geçerken bile böyle bir şeye işaret etmiyor. Her durumda, güncellenmediği sürece (minimum düzeyde olsa da) oyumu geri alamam.
user2864740

33

Kaynak kodundan (derlenmiş):

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

Görebildiğiniz ikisi while, unicode'u boşluk karakterinin altında, başında ve sonunda olan tüm karakterlerin kaldırıldığı anlamına gelir.


27

Şüphe duyduğunuzda bir birim testi yazın:

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

Not : tabii ki test (JUnit + Hamcrest için) başarısız olmaz


43
System.out.println'i yeni öğrenmiş bir programcıdan sonucun ne olduğunu görmek için bir birim testi yapmasını
isteyin

26

Yine de belirtilmesi gereken bir şey, String.trim'in kendine özgü bir "boşluk" tanımına sahip olmasıdır. Unicode boşluklarını kaldırmaz, ancak boşluk olarak kabul etmeyebileceğiniz ASCII kontrol karakterlerini de kaldırır.

Bu yöntem, bir dizenin başından ve sonundan boşlukları kırpmak için kullanılabilir; aslında, tüm ASCII kontrol karakterlerini de kırpar.

Mümkünse, Unicode beyaz boşlukları da işleyen (ve aynı zamanda null güvenli olan) Commons Lang'ın StringUtils.strip () yöntemini kullanmak isteyebilirsiniz.


3
Tasarımcılar tarafında korkunç bir gözetim gibi görünüyor .. ve belgelerin aşırı teknik çalışması pek yardımcı olmuyor.
user2864740

2
Bravo! StackOverflow'da şimdiye kadar sorulan en basit soruyu aldınız ve bu konuda söylenecek akıllıca bir şey buldunuz. Yarış için bir kredisiniz.
Mark McKenna

3
@MarkMcKenna: Bu sözde süper basit programlama sorularının (dizeleri düzeltme, dosya adı uzantılarını bulma vb.) Her zaman gizli karmaşıklıklarına sahip olduğunu görüyorum . Bu, zanaatımız ve araçlarımız hakkında biraz hayal kırıklığı yaratıyor.
Thilo

15

String sınıfı için API'ye bakın :

Dizenin başında ve sonunda boşluk bırakılmış bir kopyasını döndürür.

Her iki taraftaki boşluk kaldırılır:

Not trim(): String örneği değişmez, bu yeni bir nesne döndürür:

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

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

1
aslında hiçbir şey String örneğini değiştiremez (VM'yi
çökertebilecek

13

Java docs dayanarak burada , .trim()yaygın boşluk olarak bilinen cümledeki '\ u0020'.

Ancak, '\ u00A0' ( Unicode NO-BREAK BOŞLUK &nbsp; ) da bir boşluk olarak görülüyor ve .trim()bunu KALDIRMAZ. Bu özellikle HTML'de yaygındır.

Kaldırmak için kullanıyorum:

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

Bu sorunun bir örneği burada tartışıldı .


Javadoc'a göre boşluk, sekme, satırsonu satır başı, form beslemesi gibi baştaki ve sondaki beyaz boşlukları kaldırır ve baştaki veya sondaki karakterleri hariç tutar .
Marquis of Lorne

Teşekkürler, paylaşmama yardımcı oluyor
Asad Haider

8

Java'nın trim()boşlukları kaldırmasına örnek :

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

ÇIKTI

old = 
 This is a String.


new = This is a String.

4

Java belgelerinden (String sınıfı kaynağı),

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

Başlangıç ​​ve uzunluğu aldıktan sonra, String sınıfının alt dize yöntemini çağırdığına dikkat edin.


"Boşluk", "\ x20" değerinden küçük veya ona eşit değerlere sahip karakterler olduğunda .. parlak.
user2864740

3

trim()tüm baştaki ve sondaki boşlukları kaldıracaktır. Ancak unutmayın: Diziniz değişmez. trim()bunun yerine yeni bir dize örneği döndürecektir.


Baştaki ve sondaki tüm boşlukları
Marquis of Lorne

3

String girişiniz:

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

Evet, çıktı "abc" olacaktır; Ancak String girişiniz:

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

Çıktı olacak This is a test So trim yalnızca ilk karakterinizden önceki ve dizedeki son karakterinizden sonraki boşlukları kaldırır ve iç boşlukları yok sayar. Bu, dahili Stringkırpma yöntemini biraz optimize eden ve dizedeki ilk ve son karakterinizden önceki ve sonraki boşlukları kaldıran kodumun bir parçası . Umarım yardımcı olur.

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

Bu cevap tabloların ilk çift düz yanlış çıkış edeceğiz değil "abc" olmak. Belki unuttum .trim()içinde System.out.println(a);?
Arjan

2

Her iki taraftaki tüm boşlukları kaldıracaktır.


2

Çok önemli bir şey, tamamen "beyaz boşluklardan" oluşan bir dizenin boş bir dizge döndürmesidir.

Bir varsa string sSomething = "xxxxx", nerede xbeyaz alanlar için durmak, sSomething.trim()boş bir dize döndürür.

beyaz boşlukların durduğu string sSomething = "xxAxx"yerde a ise geri dönecektir .xsSomething.trim()A

eğer sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()dönecekse SomethingxxxxAndSomethingxElse, xsözcükler arasındaki sayının değişmediğine dikkat edin.

Düzgün paketlenmiş bir dize trim(), bu yayında gösterildiği gibi normal ifade ile birleştirmek istiyorsanız : Java kullanarak dizede yinelenen beyaz boşluklar nasıl kaldırılır? .

Sipariş, sonuç için anlamsızdır ama trim()önce daha verimli olacaktır. Umarım yardımcı olur.


2

String için yalnızca bir örnek tutmak için aşağıdakileri kullanabilirsiniz.

str = "  Hello   ";

veya

str = str.trim();

Ardından strString'in değeri olacaktırstr = "Hello"



0

Javadoc for String tüm detaylara sahiptir. Her iki uçtaki beyaz boşluğu (boşluk, sekmeler vb.) Kaldırır ve yeni bir dize döndürür.


0

Bir yöntemin ne işe yarayacağını kontrol etmek istiyorsanız BeanShell'i kullanabilirsiniz . Java'ya olabildiğince yakın olacak şekilde tasarlanmış bir betik dilidir. Genel olarak konuşursak, bazı rahatlamalarla Java olarak yorumlanır. Bu türden bir başka seçenek de Groovy dilidir. Bu komut dosyası dillerinin her ikisi de, yorumlanan dillerden bilinen uygun Oku-Değerlendir-Yazdır döngüsü sağlar. Böylece konsolu çalıştırıp şunu yazabilirsiniz:

"     content     ".trim();

Tuşuna "content"bastıktan sonra Enter(veya Ctrl+RGroovy konsolunda) sonuç olarak göreceksiniz .


6
Bu yüzden Java'daki bir yöntemi anlamak için tamamen yeni bir dil öğrenmesi gerekir. Gerçekten mi?
james.garriss

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

Bu soruyla ilgili değil.
Mark McKenna

2
@Mark ama yanlışlıkla bu soruyu açtığımda aradığım şey buydu ...
Armfoot

Aynı zamanda anlamsız. trim()Zaten repkaceAll()yapacak bir şey kalsa ne yapacağını yapıyor.
Marquis of Lorne

@EJP the replaceAll, dizedeki beyaz boşlukları tek bir boşlukla değiştirirken, trim yalnızca baştaki ve sondaki boşlukları işleyecektir
Krishna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.