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"

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

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+","")

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


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ć).


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


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.


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]+", "");

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


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”


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.


7

Możesz to zrobić po prostu przez

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

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

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


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 .


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.


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


3

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

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

Wynik

abcdef

3

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

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

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

Po pierwsze z miejscem, po drugie bez miejsca.

To jest zrobione.


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


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.


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]”, „”)


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

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

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.


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

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


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

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

    }

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.