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"
Zyamat
quelle
1
\\Wbedeutet alle Nicht-Wörter siehe download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant
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
Mögliches Duplikat von So entfernen Sie Leerzeichen in Java-Zeichenfolge
KIBOU Hassan

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+","")
Gursel Koca
quelle
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.)

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

Befiedern
quelle
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 .

Erkan Haspulat
quelle
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.

Jahir
quelle
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]+", "");
v.nivuahc
quelle
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) .

kamczak
quelle
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

Jonas Elfström
quelle
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".

Varejones
quelle
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.

Ayaskant
quelle
7

Sie können es so einfach machen, indem Sie

String newMysz = mysz.replace(" ","");
Vinod Ranga
quelle
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
avngr
quelle
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

Fatsoft
quelle
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 .

JB Nizet
quelle
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.

user27
quelle
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);    
    }
}
Jayesh
quelle
3

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

Mohammad Raza
quelle
Es gibt eine Antwort wie / gleich Ihrem Vorschlag, oben
omerhakanbilici
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
sendon1982
quelle
3

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

"myString".replace(Regex("\\s+"), "")
Jemshit Iskenderov
quelle
2
mysz = mysz.replace(" ","");

Erstens mit Raum, zweitens ohne Raum.

Dann ist es geschafft.

user2357526
quelle
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);
    }
}
Tony Nguyen
quelle
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.

Megawatt
quelle
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]", "")

Rakesh Chaudhari
quelle
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);
}
Abdur Rahman
quelle
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);  
    }
}
user9832813
quelle
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.

Rajesh Gurbani
quelle
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
Deb
quelle
0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");
Abd Abughazaleh
quelle
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();

    }

}
Kunal Vohra
quelle