Usuwanie białych znaków z ciągów znaków w Javie

684

Mam taki ciąg:

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

Chcę usunąć białe znaki w ciągu. Próbowałem, trim()ale to usuwa tylko białe spacje przed i po całym ciągu. Próbowałem też, replaceAll("\\W", "")ale potem =również został usunięty.

Jak mogę uzyskać ciąg za pomocą:

mysz2 = "name=johnage=13year=2001"
zyamat
źródło
1
\\Woznacza wszystkie nie-słowa patrz download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant
75
Jaki masz plan z ciągiem „name = johnage = 13year = 2001”? Mam nadzieję, że nie parsuję tego.
Jonas Elfström
4
@ JonasElfström Wyobrażam sobie, że może to pomóc w porównywaniu ciągów znaków
Isaac
co powiesz na to, czy tak naprawdę ciąg = = „”. Czy wszystko, co robi trims (), to czyści pusty ciąg, tak jak wspomniałem? @zyamat?
gumuruh
Możliwy duplikat sposobu usuwania białych znaków w ciągu java
KIBOU Hassan

Odpowiedzi:

1289

st.replaceAll("\\s+","")usuwa wszystkie białe znaki i niewidoczne znaki (np. tab, \n).


st.replaceAll("\\s+","")i st.replaceAll("\\s","")dają ten sam wynik.

Drugi regex jest o 20% szybszy niż pierwszy, ale wraz ze wzrostem liczby kolejnych spacji pierwsze działa lepiej niż drugie.


Przypisz wartość do zmiennej, jeśli nie zostanie użyta bezpośrednio:

st = st.replaceAll("\\s+","")
Gursel Koca
źródło
34
Chciałbym zauważyć, że te dwa wyrażenia regularne dadzą różne wyniki, jeśli chcesz zastąpić wszystkie białe znaki pojedynczą spacją (lub innym zestawem znaków). Jeśli masz kolejne spacje, użycie \ s zastąpi każdy biały znak podanymi podanymi znakami. Biorąc pod uwagę +, zastąpi każdy zestaw białych znaków jednym ciągiem zastępczym. Widzę sporo przypadków, w których ludzie mogą przychodzić do tego postu, aby zastąpić białe znaki czymś, co nie jest tylko pustym ciągiem, i może to być pomocne.
Caitlin
2
ale nie usuwa białych znaków, jeśli znajduje się na początku łańcucha.
samotny
@lonesome użyj do tego .trim ()
CQM
6
Wystarczy użyć StringUtils z apache-commons. Jest to metoda statyczna o nazwie StringUtils.deleteWhitespace.
Crozeta
@Gursel dzięki za porównanie odpowiedzi i wydajności dla dwóch wyrażeń regularnych. Zastanawiałem się, dlaczego między nimi występuje różnica w wydajności? Czy jest coś, czego mi brakuje, czy mógłbyś wskazać mi jakieś odniesienia, które mówią więcej o różnicach w wydajności.
Vishrant
247
replaceAll("\\s","")

\w = Wszystko, co jest znakiem słownym

\W = Wszystko, co nie jest słowem (w tym interpunkcja itp.)

\s = Wszystko, co jest spacją (w tym spacja, tabulatory itp.)

\S = Wszystko, co nie jest spacją (w tym zarówno litery, jak i cyfry, a także znaki interpunkcyjne itp.)

(Edycja: Jak już wspomniano, musisz uciec przed odwrotnym ukośnikiem, jeśli chcesz \sdotrzeć do silnika wyrażeń regularnych, w wyniku czego \\s.)

nitro2k01
źródło
103

Najbardziej poprawna odpowiedź na pytanie to:

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

Właśnie dostosowałem ten kod z innych odpowiedzi. Publikuję go, ponieważ oprócz tego, że jest dokładnie tym, o co pytano, pokazuje również, że wynik jest zwracany jako nowy ciąg, oryginalny ciąg nie jest modyfikowany, jak sugerują niektóre odpowiedzi.

(Doświadczeni programiści Java mogą powiedzieć „oczywiście nie można tak naprawdę modyfikować łańcucha”, ale odbiorcy docelowi tego pytania mogą o tym nie wiedzieć).

Fletch
źródło
Czy to oznacza, że ​​możemy zastąpić oryginalny ciąg, pisząc na przykład: S = S.replaceAll („\\ s”, „”); podczas gdy najpierw nastąpi zamiana, a następnie S otrzyma wersję S
frogeyedpeas
@frogeyedpeas Zastępuje zmienną, Sale nie zastępuje łańcucha, który Swskazuje.
Przywróć Monikę
Uratowałem mój dzień! ;)
Paras Jain
62

Jak o replaceAll("\\s", ""). Zobacz tutaj .

Erkan Haspulat
źródło
50
Jaka różnica może być minuta spóźnienia!
HDave
45

Jednym ze sposobów obsługi manipulacji ciągami jest StringUtils ze wspólnego Apache.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Możesz go znaleźć tutaj . commons-lang zawiera o wiele więcej i jest dobrze obsługiwany.

jahir
źródło
Ma to tę zaletę, że jest bardziej czytelne.
payne
36

Jeśli chcesz również usunąć niezniszczalne spacje, możesz zaktualizować swój kod w następujący sposób:

st.replaceAll("[\\s|\\u00A0]+", "");
v.nivuahc
źródło
Nie udaje się to w przypadku: " ab c "
Mohd Farid,
1
@MohdFarid Zastosowałem poprawkę, teraz musi być OK.
Denis Kulagin
Myślę, że powinien to być st.replaceAll („[\\ s | \ u00A0] +”, „”);
paramupk
25

Masz już poprawną odpowiedź od Gursel Koca, ale wierzę, że istnieje spora szansa, że ​​nie tak naprawdę chcesz to zrobić. Co powiesz na parsowanie kluczowych wartości?

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

wyjście:
imię = John
wiek = 13
rok = 2001

Jonas Elfström
źródło
22

Powinieneś użyć

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

zamiast:

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

W ten sposób będzie działać z więcej niż jedną spacją między każdym łańcuchem. Znak + w powyższym wyrażeniu regularnym oznacza „jeden lub więcej \ s”

Varejones
źródło
2
Podałem szybki przykład, aby to sprawdzić, ponieważ dla mnie to brzmiało dziwnie i stwierdziłem, że dodany znak plus nie jest potrzebny. Zużywa się wiele spacji oddzielających słowa. Powodem tego jest najprawdopodobniej, że replaceAllpowtarza się, dopóki wzorzec nie pasuje do żadnej części łańcucha.
nyaray
2
W rzeczy samej. +Mogą sprawić, że nieznacznie bardziej przyjazne dla CPU, ponieważ kolejny spacje są obsługiwane w jednym zastąpić operację, ale to jedyna różnica w tym przypadku. Rzeczywiście All, to nie +zastępuje niesekwencyjne białe znaki w ciągu.
nitro2k01
nie usuwa tego (u00A0)
Kerim FIRAT
8

Najłatwiej to zrobić, używając org.apache.commons.lang3.StringUtilsklasy commons-lang3biblioteki, na przykład „ commons-lang3-3.1.jar”.

Użyj statycznej metody „ StringUtils.deleteWhitespace(String str)” na łańcuchu wejściowym, a on zwróci ci łańcuch po usunięciu z niego wszystkich białych spacji. Wypróbowałem przykładowy ciąg „ name=john age=13 year=2001” i zwrócił mi dokładnie ciąg, który chciałeś - „ name=johnage=13year=2001”. Mam nadzieję że to pomoże.

Ayaskant
źródło
7

Możesz to zrobić po prostu przez

String newMysz = mysz.replace(" ","");
Vinod Ranga
źródło
O dziwo, jedyny pracownik w mojej sytuacji. Dzięki.
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
śr
źródło
4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// działa dobrze z dowolnymi spacjami * nie zapomnij spacji w żądle b

Fatsoft
źródło
Bardzo przydatne, ale nie odpowiada na zadane pytanie!
BuvinJ
3

\Woznacza „znak inny niż słowo”. Wzór dla białych znaków to \s. Jest to dobrze udokumentowane we wzorcu javadoc .

JB Nizet
źródło
8
Gdzie jest reszta tej odpowiedzi?
LS
3

W java możemy wykonać następujące operacje:

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

w tym celu musisz zaimportować następujące pakiety do swojego programu:

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

mam nadzieję, że ci to pomoże.

użytkownik27
źródło
Informacje te zostały przekazane przez wiele lat przed opublikowaniem odpowiedzi.
Jan Groth
3

Korzystanie z Pattern And Matcher jest bardziej dynamiczne.

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);    
    }
}
jayesh
źródło
3

Posługiwać się mysz.replaceAll("\\s+","");

Mohammad Raza
źródło
odpowiedź jest podobna / równa twojej sugestii powyżej
omerhakanbilici,
3

Użyj klasy ciągu ciągu apache lepiej jest unikać NullPointerException

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

Wynik

abcdef
sendon1982
źródło
3

Podczas korzystania st.replaceAll("\\s+","")w Kotlin , upewnij się zawijać "\\s+"z Regex :

"myString".replace(Regex("\\s+"), "")
Jemshit Iskenderov
źródło
2
mysz = mysz.replace(" ","");

Po pierwsze z miejscem, po drugie bez miejsca.

To jest zrobione.

użytkownik2357526
źródło
7
Aby wyjaśnić, spacja oznacza [ \t\n\x0B\f\r]. Robisz tylko normalne [ ]spacje.
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);
    }
}
Tony Nguyen
źródło
1

Aby usunąć spacje w swoim przykładzie, jest to inny sposób:

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

W ten sposób przekształca go w tablicę ze spacjami będącymi separatorami, a następnie łączy elementy w tablicy razem bez spacji.

Działa całkiem dobrze i jest łatwy do zrozumienia.

Megawat
źródło
2
Ale bardzo nieefektywne rozwiązanie. I, jak widać z innych rozwiązań - działa to tylko dla "" przestrzeni - a nie dla różnych rodzajów białych znaków.
GhostCat
1

Są też inne znaki spacji, które również istnieją w ciągach. Więc znak spacji może być potrzebny do zastąpienia przez łańcuchy.

Np .: PRZESTRZEŃ BEZ PRZERW, PRZESTRZEŃ TRZECI NA EM, PRZESTRZEŃ PUNKTUACYJNA

Oto lista znaków spacji http://jkorpela.fi/chars/spaces.html

Musimy więc zmodyfikować

\ u2004 nas dla TRZECIEJ PRZESTRZEŃ EM

s.replaceAll („[[u0020 \ u2004]”, „”)

Rakesh Chaudhari
źródło
0

Białe znaki można usunąć za pomocą funkcji isWhitespace z klasy znaków.

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);
}
Abdur Rahman
źródło
0

Oddziel każdą grupę tekstu do własnego podłańcucha, a następnie połącz te podłańcuchy:

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);  
    }
}
użytkownik9832813
źródło
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;
}

To może pomóc.

Rajesh Gurbani
źródło
0

Możesz także rzucić okiem na poniższy kod Java. Poniższe kody nie używają żadnych „wbudowanych” metod.

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

    }
}

Wejście:

String inp = "01239Debashish123Pattn456aik";

Wynik:

The String is: 01239123456
Deb
źródło
0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");
Abd Abughazaleh
źródło
0

Udzielono dość wielu odpowiedzi. Chciałbym podać rozwiązanie, które jest dość czytelne i lepsze niż regex.

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

    }

}
Kunal Vohra
źródło