Leerzeichen aus Zeichenfolgen in Java entfernen


684

Ich habe eine Zeichenfolge wie diese:

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

Ich möchte die Leerzeichen in der Zeichenfolge entfernen. Ich habe es versucht, trim()aber dadurch werden nur Leerzeichen vor und nach der gesamten Zeichenfolge entfernt. Ich habe es auch versucht, replaceAll("\\W", "")aber dann wird das =auch entfernt.

Wie kann ich eine Zeichenfolge erreichen mit:

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

1

75
Was ist Ihr Plan mit der Zeichenfolge "name = johnage = 13year = 2001"? Ich hoffe, es nicht zu analysieren.
Jonas Elfström

4
@ JonasElfström Ich stelle mir vor, es hilft bei String-Vergleichen
Isaac

Wie wäre es, wenn der String tatsächlich = "" ist? Ist alles, was trims () tut, das Löschen der leeren Zeichenfolge, wie ich es erwähnt habe? @zyamat?
Gumuruh

Antworten:


1287

st.replaceAll("\\s+","")Entfernt alle Leerzeichen und nicht sichtbaren Zeichen (z. B. Tabulator \n).


st.replaceAll("\\s+","")und st.replaceAll("\\s","")produzieren das gleiche Ergebnis.

Die zweite Regex ist 20% schneller als die erste, aber mit zunehmender Anzahl aufeinanderfolgender Leerzeichen ist die Leistung des ersten besser als die des zweiten.


Weisen Sie den Wert einer Variablen zu, wenn er nicht direkt verwendet wird:

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

34
Ich möchte darauf hinweisen, dass diese beiden regulären Ausdrücke unterschiedliche Ergebnisse liefern, wenn Sie alle Leerzeichen durch ein einzelnes Leerzeichen (oder einen anderen Zeichensatz) ersetzen möchten. Wenn Sie aufeinanderfolgende Leerzeichen haben, wird mit \\ s jedes Leerzeichen durch die angegebenen Zeichen ersetzt. Bei \\ s + wird jeder Satz von Leerzeichen durch eine einzelne Ersetzungszeichenfolge ersetzt. Ich kann einige Fälle sehen, in denen Leute zu diesem Beitrag kommen, um Leerzeichen durch etwas zu ersetzen, das nicht nur eine leere Zeichenfolge ist, und dies kann hilfreich sein.
Caitlin

2
Der Leerraum wird jedoch nicht entfernt, wenn er sich am Anfang der Zeichenfolge befindet.
einsam

@ einsame verwenden .trim () dafür
CQM

6
Verwenden Sie einfach StringUtils von Apache-Commons. Es ist eine statische Methode namens StringUtils.deleteWhitespace.
Crozeta

@ Gursel danke für die Antwort und den Leistungsvergleich für zwei Regex. Ich habe mich gefragt, warum es einen Leistungsunterschied zwischen zwei gibt. Fehlt mir etwas? Könnten Sie mich bitte auf eine Referenz hinweisen, die mehr über den Leistungsunterschied spricht?
Vishrant

247
replaceAll("\\s","")

\w = Alles, was ein Wortzeichen ist

\W = Alles, was kein Wortzeichen ist (einschließlich Interpunktion usw.)

\s = Alles, was ein Leerzeichen ist (einschließlich Leerzeichen, Tabulatorzeichen usw.)

\S = Alles, was kein Leerzeichen ist (einschließlich Buchstaben und Zahlen sowie Interpunktion usw.)

(Bearbeiten: Wie bereits erwähnt, müssen Sie dem Backslash entkommen, wenn Sie \sdie Regex-Engine erreichen möchten \\s.)


103

Die richtigste Antwort auf die Frage lautet:

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

Ich habe gerade diesen Code aus den anderen Antworten angepasst. Ich poste es, weil es nicht genau das ist, was die Frage angefordert hat, sondern auch zeigt, dass das Ergebnis als neue Zeichenfolge zurückgegeben wird. Die ursprüngliche Zeichenfolge wird nicht geändert, da einige der Antworten dies implizieren.

(Erfahrene Java-Entwickler könnten sagen: "Natürlich können Sie einen String nicht ändern", aber die Zielgruppe für diese Frage weiß dies möglicherweise nicht.)


Bedeutet dies, dass wir die ursprüngliche Zeichenfolge überschreiben können, indem wir beispielsweise schreiben: S = S.replaceAll ("\\ s", ""); wohingegen zuerst das Ersetzen durchgeführt wird und dann S die
zeichenlose

@frogeyedpeas Das überschreibt die Variable S, überschreibt aber nicht die Zeichenfolge, auf die Szeigt.
Stellen Sie Monica

Rettete meinen Tag! ;)
Paras Jain

62

Wie wäre es mit replaceAll("\\s", ""). Siehe hier .


49
Was für einen Unterschied kann es sein, eine Minute zu spät zu sein!
HDave

45

Eine Möglichkeit, mit String-Manipulationen umzugehen, sind StringUtils von Apache Commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Sie finden es hier . commons-lang enthält viel mehr und wird gut unterstützt.


Dies hat den Vorteil, dass es besser lesbar ist.
Payne

36

Wenn Sie auch unzerbrechliche Leerzeichen entfernen müssen, können Sie Ihren Code folgendermaßen aktualisieren:

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

Dies schlägt fehl für: " ab c "
Mohd Farid

1
@MohdFarid Ein Fix angewendet, muss jetzt ok sein.
Denis Kulagin

Ich denke, es sollte st.replaceAll sein ("[\\ s | \ u00A0] +", "");
Paramupk

30

Wenn Sie Dienstprogrammklassen regulären Ausdrücken vorziehen, gibt es in StringUtils im Spring Framework eine Methode trimAllWhitespace (String) .


13
Alternative Ideen sind willkommen. Sie werden einigen Menschen helfen, auch wenn nicht allen.
James.garriss

25

Sie haben bereits die richtige Antwort von Gursel Koca erhalten, aber ich glaube, dass es eine gute Chance gibt, dass dies nicht das ist, was Sie wirklich tun möchten. Wie wäre es stattdessen mit dem Parsen der Schlüsselwerte?

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

Ausgabe:
Name = John
Alter = 13
Jahr = 2001


22

Du solltest benutzen

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

anstatt:

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

Auf diese Weise funktioniert es mit mehr als einem Leerzeichen zwischen den einzelnen Zeichenfolgen. Das + -Zeichen im obigen regulären Ausdruck bedeutet "ein oder mehrere \ s".


2
Ich habe ein kurzes Beispiel eingegeben, um dies zu überprüfen, da es für mich seltsam klang und festgestellt hat, dass das hinzugefügte Pluszeichen nicht benötigt wird. Es werden mehrere Leerzeichen zwischen Wörtern verwendet. Der Grund dafür ist höchstwahrscheinlich, dass es replaceAllwiederholt wird, bis das Muster mit keinem Teil der Zeichenfolge übereinstimmt.
Nyaray

2
Tatsächlich. Das +kann es geringfügig mehr CPU - freundlich, weil aufeinander folgende Leerzeichen in einem Betrieb einzelnen gehandhabt werden ersetzen, aber das ist der einzige Unterschied in diesem Fall. Es ist in der Tat das All, nicht das +, das nicht aufeinanderfolgende Leerzeichen in der Zeichenfolge ersetzt.
Nitro2k01

es löscht dies nicht (u00A0)
Kerim FIRAT

8

Der einfachste Weg , dies zu tun ist durch die Verwendung der org.apache.commons.lang3.StringUtilsKlasse der commons-lang3Bibliothek wie "commons-lang3-3.1.jar “ zum Beispiel.

Verwenden Sie die statische Methode " StringUtils.deleteWhitespace(String str)" für Ihre Eingabezeichenfolge. Nach dem Entfernen aller Leerzeichen wird eine Zeichenfolge zurückgegeben. Ich habe Ihre Beispielzeichenfolge " name=john age=13 year=2001" ausprobiert und sie hat mir genau die Zeichenfolge zurückgegeben, die Sie wollten - " name=johnage=13year=2001". Hoffe das hilft.


7

Sie können es so einfach machen, indem Sie

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

Erstaunlicherweise der einzige Arbeiter in meiner Situation. Vielen Dank.
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("  "," ");

// es funktioniert gut mit Leerzeichen * Leerzeichen in sting nicht vergessen b


Sehr nützlich, beantwortet aber die gestellte Frage nicht!
BuvinJ

3

\Wbedeutet "Nicht-Wort-Zeichen". Das Muster für Leerzeichen ist \s. Dies ist im Pattern Javadoc gut dokumentiert .


8
Wo ist der Rest dieser Antwort?
LS

3

In Java können wir folgende Operation ausführen:

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

Dazu müssen Sie folgende Pakete in Ihr Programm importieren:

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

ich hoffe es hilft dir.


Diese Informationen wurden von anderen Jahren bereitgestellt, bevor Sie Ihre Antwort veröffentlicht haben.
Jan Groth

3

Mit Pattern And Matcher ist es dynamischer.

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

Verwenden Sie die Utache-Klasse für Apache-Zeichenfolgen, um eine NullPointerException zu vermeiden

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

Ausgabe

abcdef

3

Stellen Sie bei der Verwendung st.replaceAll("\\s+","")in Kotlin sicher, dass Sie Regex verwenden :"\\s+"

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

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

Erstens mit Raum, zweitens ohne Raum.

Dann ist es geschafft.


7
Nur zur Verdeutlichung bedeutet Leerzeichen [ \t\n\x0B\f\r]. Sie machen nur normale [ ]Räume.
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

Um Leerzeichen in Ihrem Beispiel zu entfernen, gehen Sie folgendermaßen vor:

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

Dies konvertiert es in ein Array, wobei die Leerzeichen die Trennzeichen sind, und kombiniert dann die Elemente im Array ohne Leerzeichen.

Es funktioniert ziemlich gut und ist leicht zu verstehen.


2
Aber eine sehr ineffiziente Lösung. Und wie Sie aus den anderen Lösungen ersehen können, funktioniert dies nur für "" Leerzeichen - und nicht für verschiedene Arten von Leerzeichen.
GhostCat

1

Es gibt auch andere Leerzeichen in Zeichenfolgen. Daher müssen wir möglicherweise Leerzeichen aus Zeichenfolgen ersetzen.

Beispiel: NO-BREAK-RAUM, DREI-PRO-EM-RAUM, PUNKTIONSRAUM

Hier ist die Liste der Leerzeichen http://jkorpela.fi/chars/spaces.html

Also müssen wir ändern

\ u2004 uns für DREI-PER-EM-RAUM

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


0

Leerzeichen können mithilfe der Funktion isWhitespace aus der Zeichenklasse entfernt werden.

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

Trennen Sie jede Textgruppe in einen eigenen Teilstring und verketten Sie diese Teilstrings:

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

Dies könnte helfen.


0

Sie können sich auch den folgenden Java-Code ansehen. Die folgenden Codes verwenden keine "integrierten" Methoden.

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

    }
}

Eingang:

String inp = "01239Debashish123Pattn456aik";

Ausgabe:

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

Es werden sehr viele Antworten gegeben. Ich möchte eine Lösung geben, die gut lesbar und besser als Regex ist.

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

    }

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.