350 Stimmen

Java: Ersetzen von 2 oder mehr Leerzeichen durch ein einzelnes Leerzeichen in einem String und Löschen von führenden und nachfolgenden Leerzeichen

Suche nach einer schnellen, einfachen Möglichkeit in Java, diese Zeichenfolge zu ändern

" hello     there   "

zu etwas, das wie folgt aussieht

"hello there"

wo ich all diese mehrfachen Leerzeichen durch ein einzelnes Leerzeichen ersetze, außer dass ich auch möchte, dass die ein oder mehreren Leerzeichen am Anfang der Zeichenfolge verschwinden.

Etwas wie das hier bringt mich teilweise dahin

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

aber nicht ganz.

10 Stimmen

Sie sollten in Erwägung ziehen, eine Antwort zu akzeptieren. Das macht es den Leuten, die später auf die Seite kommen, viel einfacher, eine endgültige Lösung zu wählen.

2 Stimmen

Dies ist eine der am meisten empfohlenen Methoden. => . String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

4 Stimmen

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

586voto

polygenelubricants Punkte 362173

Versuchen Sie dies:

String after = before.trim().replaceAll(" +", " ");

Siehe auch


Nein trim() regex

Es ist auch möglich, dies mit nur einem replaceAll aber das ist viel weniger lesbar als die trim() Lösung. Nichtsdestotrotz wird sie hier nur bereitgestellt, um zu zeigen, was regex tun kann:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

Es gibt 3 Stellvertreter:

  • ^_+ : eine beliebige Folge von Leerzeichen am Anfang der Zeichenkette
    • Anpassen und ersetzen durch $1 der die leere Zeichenkette erfasst
  • _+$ : eine beliebige Folge von Leerzeichen am Ende der Zeichenkette
    • Anpassen und ersetzen durch $1 der die leere Zeichenkette erfasst
  • (_)+ : eine beliebige Folge von Leerzeichen, die mit keinem der oben genannten übereinstimmt, d.h. in der Mitte liegt
    • Anpassen und ersetzen durch $1 die einen einzigen Raum erfasst

Siehe auch

181voto

sarah.ferguson Punkte 3007

Sie brauchen nur einen:

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

wo Sie ein oder mehrere Leerzeichen übereinstimmen und sie durch ein einzelnes Leerzeichen ersetzen und dann Leerzeichen am Anfang und Ende abschneiden (Sie könnten tatsächlich invertieren, indem Sie zuerst abschneiden und dann übereinstimmen, um die Regex schneller zu machen, wie jemand darauf hingewiesen hat).

Probieren Sie es schnell aus:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

und sie wird zurückkehren:

"hello there"

70voto

Monica Granbois Punkte 5772

Verwenden Sie die Apache Commons StringUtils.normalizeSpace(String str) Methode. Siehe Dokumente hier

28voto

k sarath Punkte 531

Trim()-Methode werden die führenden und nachfolgenden Leerzeichen entfernt und die replaceAll("regex", "zu ersetzende Zeichenkette") Methode mit regex " \s +" findet mehr als ein Leerzeichen und ersetzt es durch ein einzelnes Leerzeichen

myText = myText.trim().replaceAll("\\s+"," ");

25voto

Doctor Punkte 5362

Das hat bei mir perfekt funktioniert: sValue = sValue.trim().replaceAll("\\s+", " ");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X