Java'daki dizelerden boşluk kaldırma


684

Ben böyle bir dize var:

mysz = "name=john age=13 year=2001";

Dizedeki beyaz boşlukları kaldırmak istiyorum. Denedim trim()ama bu sadece tüm boşluk önce ve sonra boşlukları kaldırır. Ben de denedim replaceAll("\\W", "")ama sonra =da kaldırılır.

Nasıl bir dize elde edebilirsiniz:

mysz2 = "name=johnage=13year=2001"

1
\\Wtüm kelimeler olmayan anlamına gelir bkz. download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant

76
"Name = johnage = 13year = 2001" dizesiyle planınız nedir? Ayrıştırmamayı umuyorum.
Jonas Elfström

4
@ JonasElfström Ben dize karşılaştırmalarına yardımcı olduğunu hayal
Isaac

dizenin aslında = "" olup olmadığı hakkında. Dediğim gibi tüm trims () boş dizeyi temizlemek mi? @zyamat?
Gumuruh

Yanıtlar:


1289

st.replaceAll("\\s+","")tüm boşlukları ve görünmeyen karakterleri (ör \n. sekme, ) kaldırır .


st.replaceAll("\\s+","")ve st.replaceAll("\\s","")aynı sonucu verir.

İkinci normal ifade birinciden% 20 daha hızlıdır, ancak ardışık boşluk sayısı arttıkça ilki ikincisinden daha iyi performans gösterir.


Doğrudan kullanılmıyorsa, değeri bir değişkene atayın:

st = st.replaceAll("\\s+","")

34
Tüm boşlukları tek bir boşlukla (veya başka bir karakter kümesiyle) değiştirmek istiyorsanız, bu iki normal ifadenin farklı sonuçlar üreteceğini belirtmek isterim. Art arda boşluklarınız varsa, \\ s tuşunu kullanarak her boşluk karakterini verilen karakterlerle değiştirir. \\ s + verildiğinde, her beyaz alan kümesini tek bir değiştirme dizesiyle değiştirir. İnsanların boşluğa sadece boş bir dize olmayan bir şeyle değiştirmek için bu gönderiye gelebilecekleri birkaç durumu görebilirim ve bu yardımcı olabilir.
Caitlin

2
ancak dizenin başındaysa beyaz boşluğu kaldırmaz.
Yalnız

@lonesome use .trim () for
CQM

6
Apache-commons'dan StringUtils kullanın. StringUtils.deleteWhitespace adlı statik bir yöntemdir.
Crozeta

@Gursel, iki normal ifadenin yanıtı ve performans karşılaştırması için teşekkürler. İkisi arasında neden bir performans farkı olduğunu merak ediyordum? Eksik olduğum bir şey var mı, bana performans farkı hakkında daha fazla konuşan herhangi bir referans gösterebilir misiniz?
Vishrant

248
replaceAll("\\s","")

\w = Kelime karakteri olan her şey

\W = Kelime karakteri olmayan herhangi bir şey (noktalama işaretleri dahil)

\s = Boşluk karakteri olan herhangi bir şey (boşluk, sekme karakterleri vb. Dahil)

\S = Boşluk olmayan herhangi bir şey (hem harfler hem de sayılar, noktalama işaretleri vb. Dahil)

(Düzenleme: Belirtildiği gibi \s, regex motoruna ulaşmak istiyorsanız ters eğik çizgiden kaçmanız gerekir \\s.)


103

Sorunun en doğru cevabı:

String mysz2 = mysz.replaceAll("\\s","");

Bu kodu diğer cevaplardan uyarladım. Gönderiyorum çünkü tam olarak sorulan soru olmanın yanı sıra , sonucun yeni bir dize olarak döndürüldüğünü gösterir , orijinal dize değiştirilmez bazı cevaplar tür ima olarak çünkü gönderiyorum.

(Deneyimli Java geliştiricileri "elbette bir Dizeyi gerçekten değiştiremezsiniz" diyebilir, ancak bu sorunun hedef kitlesi bunu bilmiyor olabilir.)


Bu, örneğin yazarak orijinal dizenin üzerine yazabileceğimiz anlamına mı gelir: S = S.replaceAll ("\\ s", ""); oysa önce değiştirme yapılacak ve ardından S, S
frogeyedpeas

@frogeyedpeas Bu değişkenin üzerine yazar Sancak işaret eden dizenin üzerine yazmazS .
Monica

Günümü kurtardım! ;)
Paras Jain


45

Dize manipülasyonlarını işlemenin bir yolu Apache ortaklarından StringUtils'dir.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Burada bulabilirsiniz . commons-lang çok daha fazlasını içerir ve iyi desteklenir.


Bunun daha okunabilir olma avantajı vardır.
payne

36

Kırılmaz boşlukları da kaldırmanız gerekirse, kodunuzu şu şekilde yükseltebilirsiniz:

st.replaceAll("[\\s|\\u00A0]+", "");

Bu başarısız: " ab c "
Mohd Farid

1
@MohdFarid Bir düzeltme uyguladı, şimdi iyi olmalı.
Denis Kulagin

Bence st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk


25

Gürsel Koca'dan zaten doğru cevabı aldın, ancak inanıyorum ki bu gerçekten yapmak istediğin şey değil. Bunun yerine anahtar / değer çiftlerini ayrıştırmaya ne dersiniz?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

çıktı:
isim = john
yaş = 13
yıl = 2001


22

Kullanmalısın

s.replaceAll("\\s+", "");

onun yerine:

s.replaceAll("\\s", "");

Bu şekilde, her dize arasında birden fazla boşlukla çalışır. Yukarıdaki normal ifadedeki + işareti "bir veya daha fazla \ s" anlamına gelir


2
Bunu kontrol etmek için hızlı bir örnek yazdım çünkü bana garip geldi ve eklenen artı işaretinin gerekli olmadığını gördüm. Kelimeleri ayıran birden çok boşluk tüketilir. Bunun nedeni replaceAll, desen dizenin herhangi bir bölümü ile eşleşmeyene kadar tekrarlanmasıdır.
nyaray

2
Aslında. +Ardışık boşluk değiştirme işlemi tek işlenme şeklinden dolayı, bu marjinal fazla CPU uyumlu hale getirebilir, ama bu durumda tek fark bu. Gerçekten var All, değil +dizede yerine gelen ardışık olmayan boşluk.
nitro2k01

bunu silmez (u00A0)
Kerim FIRAT

8

Bunu yapmanın en kolay yolu kullanmaktır org.apache.commons.lang3.StringUtilssınıfını commons-lang3"gibi kütüphanedencommons-lang3-3.1.jar örneğin " .

StringUtils.deleteWhitespace(String str)Giriş dizenizdeki " " statik yöntemini kullanın, tüm beyaz boşlukları kaldırdıktan sonra size bir dize döndürür. Örnek dizenizi " name=john age=13 year=2001" denedim ve bana tam olarak istediğiniz dizeyi döndürdü - " name=johnage=13year=2001". Bu yardımcı olur umarım.


7

Bunu çok basit bir şekilde yapabilirsiniz

String newMysz = mysz.replace(" ","");

Şaşırtıcı, benim durumumdaki tek işçi. Teşekkürler.
Valeriy

6
public static void main(String[] args) {        
    String s = "name=john age=13 year=2001";
    String t = s.replaceAll(" ", "");
    System.out.println("s: " + s + ", t: " + t);
}

Output:
s: name=john age=13 year=2001, t: name=johnage=13year=2001

4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// herhangi bir alanda iyi çalışıyor * sokmada boşluğu unutma b


Çok faydalı, ancak gönderilen soruyu cevaplamıyor!
BuvinJ

3

\W"kelime olmayan karakter" anlamına gelir. Boşluk karakterleri için desen \s. Bu Pattern javadoc'ta iyi belgelenmiştir .


8
Bu cevabın geri kalanı nerede?
LS

3

Java'da aşağıdaki işlemi yapabiliriz:

String pattern="[\\s]";
String replace="";
part="name=john age=13 year=2001";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(part);
part=m.replaceAll(replace);
System.out.println(part);

bunun için programınıza aşağıdaki paketleri aktarmanız gerekir:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

Umarım bu sana yardımcı olur.


Bu bilgiler, yanıtınızı göndermeden yıllar önce başkaları tarafından verilmiştir.
jan groth

3

Desen ve Eşleştirici kullanarak daha dinamiktir.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RemovingSpace {

    /**
     * @param args
     * Removing Space Using Matcher
     */
    public static void main(String[] args) {
        String str= "jld fdkjg jfdg ";
        String pattern="[\\s]";
        String replace="";

        Pattern p= Pattern.compile(pattern);
        Matcher m=p.matcher(str);

        str=m.replaceAll(replace);
        System.out.println(str);    
    }
}


3

NullPointerException'ı önlemek için apache string util sınıfını kullanmak daha iyidir

org.apache.commons.lang3.StringUtils.replace("abc def ", " ", "")

Çıktı

abcdef

3

Kullanırken st.replaceAll("\\s+","")de KOTLIN , sen sarın emin olun "\\s+"ile Regex :

"myString".replace(Regex("\\s+"), "")

2
mysz = mysz.replace(" ","");

Birincisi boşluklu, ikincisi boşluksuz.

Sonra yapılır.


7
Sadece açıklığa kavuşturmak, boşluk demek [ \t\n\x0B\f\r]. Sadece normal [ ]boşluklar yapıyorsunuz .
GKFX

2
import java.util.*;
public class RemoveSpace {
    public static void main(String[] args) {
        String mysz = "name=john age=13 year=2001";
        Scanner scan = new Scanner(mysz);

        String result = "";
        while(scan.hasNext()) {
            result += scan.next();
        }
        System.out.println(result);
    }
}


1

Örneğinizdeki boşlukları kaldırmak için bunu yapmanın başka bir yoludur:

String mysz = "name=john age=13 year=2001";
String[] test = mysz.split(" ");
mysz = String.join("", mysz);

Bunun yaptığı, onu ayırıcılar olan boşluklarla bir diziye dönüştürmektir ve daha sonra dizideki öğeleri boşluklar olmadan birleştirir.

Oldukça iyi çalışıyor ve anlaşılması kolay.


2
Ama çok verimsiz bir çözüm. Ve diğer çözümlerden de görebileceğiniz gibi - bu yalnızca "" alan - için çalışır, farklı türdeki beyaz alanlar için geçerli değildir.
GhostCat

1

Başkaları da boşluk karakter dizeleri var .. Yani boşluk karakter dizeleri değiştirmek gerekebilir.

Örn: KIRILMAYAN ALAN, EM BAŞINA ÜÇ ALAN, PUNCTUATION SPACE

Alan karakterlerinin listesi http://jkorpela.fi/chars/spaces.html

Bu yüzden değiştirmemiz gerekiyor

\ U2004 BIZE ÜZERİ ALAN İÇİN

s.replaceAll ( "[\ u0020 \ u2004]", "")


0

Beyaz boşluk, Karakter Sınıfından isWhitespace işlevini kullanarak kaldırılabilir.

public static void main(String[] args) {
    String withSpace = "Remove white space from line";
    StringBuilder removeSpace = new StringBuilder();

    for (int i = 0; i<withSpace.length();i++){
        if(!Character.isWhitespace(withSpace.charAt(i))){
            removeSpace=removeSpace.append(withSpace.charAt(i));
        }
    }
    System.out.println(removeSpace);
}

0

Her metin grubunu kendi alt dizesine ayırın ve ardından bu alt dizeleri birleştirin:

public Address(String street, String city, String state, String zip ) {
    this.street = street;
    this.city = city;
    // Now checking to make sure that state has no spaces...
    int position = state.indexOf(" ");
    if(position >=0) {
        //now putting state back together if it has spaces...
        state = state.substring(0, position) + state.substring(position + 1);  
    }
}

0
public static String removeWhiteSpaces(String str){
    String s = "";
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        int temp = arr[i];
        if(temp != 32 && temp != 9) { // 32 ASCII for space and 9 is for Tab
            s += arr[i];
        }
    }
    return s;
}

Bu yardımcı olabilir.


0

Aşağıdaki Java koduna da bakabilirsiniz. Aşağıdaki kodlarda "yerleşik" yöntem kullanılmaz.

/**
 * Remove all characters from an alphanumeric string.
 */
public class RemoveCharFromAlphanumerics {

    public static void main(String[] args) {

        String inp = "01239Debashish123Pattn456aik";

        char[] out = inp.toCharArray();

        int totint=0;

        for (int i = 0; i < out.length; i++) {
            System.out.println(out[i] + " : " + (int) out[i]);
            if ((int) out[i] >= 65 && (int) out[i] <= 122) {
                out[i] = ' ';
            }
            else {
                totint+=1;
            }

        }

        System.out.println(String.valueOf(out));
        System.out.println(String.valueOf("Length: "+ out.length));

        for (int c=0; c<out.length; c++){

            System.out.println(out[c] + " : " + (int) out[c]);

            if ( (int) out[c] == 32) {
                System.out.println("Its Blank");
                 out[c] = '\'';
            }

        }

        System.out.println(String.valueOf(out));

        System.out.println("**********");
        System.out.println("**********");
        char[] whitespace = new char[totint];
        int t=0;
        for (int d=0; d< out.length; d++) {

            int fst =32;



            if ((int) out[d] >= 48 && (int) out[d] <=57 ) {

                System.out.println(out[d]);
                whitespace[t]= out[d];
                t+=1;

            }

        }

        System.out.println("**********");
        System.out.println("**********");

        System.out.println("The String is: " + String.valueOf(whitespace));

    }
}

Giriş:

String inp = "01239Debashish123Pattn456aik";

Çıktı:

The String is: 01239123456

0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");

0

Oldukça fazla cevap veriliyor. Normalden daha okunabilir ve daha iyi bir çözüm vermek istiyorum.

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

public class RemoveAllWhitespaceTest {

    public static void main(String[] args) throws IOException {

        String str1 = "\n\tThis is my string \n \r\n  !";

        System.out.println("[" + str1 + "]");

        System.out.println("Whitespace Removed:");

        System.out.println("[" + StringUtils.deleteWhitespace(str1) + "]");

        System.out.println();

    }

}
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.