Wie entferne ich doppelte Leerzeichen in Zeichenfolgen mit Java?


147

Wie entferne ich doppelte Leerzeichen (einschließlich Tabulatoren, Zeilenumbrüche, Leerzeichen usw.) in einer Zeichenfolge mit Java?

Antworten:


378

So was:

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

Beispielsweise

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

Ausgänge

lorem ipsum dolor sit.

Was bedeutet , dass \s+Mittel?

\s+ist ein regulärer Ausdruck. \sEntspricht einem Leerzeichen, einer Registerkarte, einer neuen Zeile, einem Wagenrücklauf, einem Formularvorschub oder einer vertikalen Registerkarte und +sagt "eine oder mehrere davon". Somit reduziert der obige Code alle "Leerzeichen-Teilzeichenfolgen", die länger als ein Zeichen sind, mit einem einzelnen Leerzeichen.


Quelle: Java: Entfernen doppelter Leerzeichen in Zeichenfolgen


3
@SuhrobSamiev - String.replaceAll () ist seit JDK 1.4 in Java. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles

3
Ich wünschte, ich könnte mehr als +1 für die großartige Erklärung von \ s + hinzufügen.
Cyntech

Ich habe verstanden, \s+aber was bedeutet 2 Backslash \\?
SchösslingPro

2
Das Zeichenfolgenliteral "\\"stellt die Zeichenfolge dar, die aus einem einzelnen Backslash besteht. Also um \s+dich zu repräsentieren schreibst "\\s+".
Aioobe

1
Wird dies den Wagenrücklauf entfernen? oder müsste ich "\\ r" separat entfernen? Vielen Dank!
user3388884

24

Sie können den regulären Ausdruck verwenden

(\s)\1

und

Ersetzen Sie es durch $1.

Java-Code:

str = str.replaceAll("(\\s)\\1","$1");

Wenn die Eingabe ist, erhalten "foo\t\tbar "Sie "foo\tbar "als Ausgabe.
Wenn die Eingabe jedoch ist "foo\t bar", bleibt sie unverändert, da sie keine aufeinanderfolgenden Leerzeichen enthält.

Wenn Sie alle Leerzeichen (Leerzeichen, vertikale Registerkarte, horizontale Registerkarte, Wagenrücklauf, Formularvorschub, neue Zeile) als Leerzeichen behandeln, können Sie den folgenden regulären Ausdruck verwenden, um eine beliebige Anzahl aufeinanderfolgender Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen :

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

Wenn Sie jedoch zwei aufeinanderfolgende Leerzeichen durch ein einzelnes Leerzeichen ersetzen möchten, sollten Sie Folgendes tun:

str = str.replaceAll("\\s{2}"," ");

9

Versuchen Sie dies - Sie müssen import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

Wo stringist Ihre Zeichenfolge, an der Sie doppelte Leerzeichen entfernen müssen?


9

Hallo, der schnellste (aber nicht schönste) Weg, den ich gefunden habe, ist

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

Dies läuft ziemlich schnell auf Android im Gegensatz zu einem regulären Ausdruck


1
Funktioniert nur für Leerzeichen, nicht jedoch für andere Leerzeichen wie Tabulatoren und Zeilenumbrüche.
Pang

1
Ich weiß, Sie müssen mehr davon hinzufügen, während Schleifen für andere Entitäten. Aber dieser Code läuft auf Android viel schneller als diese Regex, ich musste komplette E-Books verarbeiten.
Wutzebaer

Auch auf dem Desktop enorm schneller. Ich habe es nicht für eine große Zeichenfolge getestet, aber wenn Sie vorhaben, es auf vielen kleinen Zeichenfolgen auszuführen, ist dies die Antwort, nach der Sie suchen.
Ivelate

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

Obwohl es zu spät ist, habe ich eine bessere Lösung gefunden (die für mich funktioniert), die alle aufeinanderfolgenden Leerzeichen des gleichen Typs durch ein Leerzeichen dieses Typs ersetzt. Das ist:

   Hello!\n\n\nMy    World  

wird sein

 Hello!\nMy World 

Beachten Sie, dass es immer noch führende und nachfolgende Leerzeichen gibt. Meine Komplettlösung lautet also:

str = str.trim().replaceAll("(\\s)+", "$1"));

Hier trim()ersetzt all vorderen und hinteren weißen Raum Strings mit „“. (\\s)dient zum Erfassen \\s(dh Leerzeichen wie '', '\ n', '\ t') in Gruppe 1 . +Das Vorzeichen steht für die Übereinstimmung mit einem oder mehreren vorhergehenden Token. Es (\\s)+können also aufeinanderfolgende Zeichen (1 oder mehr) unter einzelnen Leerzeichen ('', '\ n' oder '\ t') sein. $1dient zum Ersetzen der übereinstimmenden Zeichenfolgen durch die Zeichenfolge der Gruppe 1 (die nur 1 Leerzeichen enthält) des übereinstimmenden Typs (dh das einzelne Leerzeichen, das übereinstimmt). Die obige Lösung ändert sich folgendermaßen:

   Hello!\n\n\nMy    World  

wird sein

Hello!\nMy World

Ich habe meine obige Lösung hier nicht gefunden und sie daher veröffentlicht.


0

Wenn Sie alle führenden und nachfolgenden überflüssigen Leerzeichen entfernen möchten, möchten Sie Folgendes tun:

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

Anschließend können Sie die Duplikate mit den anderen hier aufgeführten Strategien entfernen:

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

0

Sie können auch versuchen, String Tokeniser für alle Leerzeichen, Tabulatoren, Zeilenumbrüche und alle zu verwenden. Ein einfacher Weg ist,

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

Dies kann in drei Schritten möglich sein:

  1. Konvertieren Sie die Zeichenfolge in ein Zeichenarray (ToCharArray).
  2. Beantragen Sie eine Schleife auf dem Charater-Array
  3. Wenden Sie dann die Funktion zum Ersetzen von Zeichenfolgen an (Ersetzen ("Stich, den Sie ersetzen möchten", "ursprüngliche Zeichenfolge")).

1
Das ist keine gute Lösung, das Ablegen in ein Char-Array löst nichts. Sie erklären nicht wirklich, wie das Ersetzen durchgeführt wird, was der Kern des Problems ist. Bitte posten Sie auch keine völlig unabhängigen Links. In diesem Fall werden Sie als Spammer gekennzeichnet.
Mat
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.