it-swarm.com.de

Wie entferne ich nur nachgestellte Leerzeichen einer Zeichenfolge in Java und halte führende Leerzeichen?

Die trim() - Funktion entfernt sowohl das abschließende als auch das führende Leerzeichen. Wenn ich jedoch nur das abschließende Leerzeichen eines Strings entfernen möchte, wie kann ich das tun?

37
kzjfr0

Seit JDK 11

Wenn Sie mit JDK 11 oder höher arbeiten, sollten Sie wahrscheinlich stripTrailing () verwenden.


Frühere JDK-Versionen

Mit dem regulären Ausdruck \s++$ können Sie alle nachfolgenden Leerzeichen (einschließlich Leerzeichen und Tabulatorzeichen) durch die leere Zeichenfolge ("") ersetzen.

final String text = "  foo   ";
System.out.println(text.replaceFirst("\\s++$", ""));

Ausgabe

  foo

Online Demo.

Hier ist eine Aufgliederung der Regex:

  • \s - jedes Leerzeichen,
  • ++ - mit einem oder mehreren der vorherigen Token übereinstimmen (besitzlos); d. h. mit einem oder mehreren Leerzeichen übereinstimmen. Das +-Muster wird in seiner Possessivform++ verwendet. Dies dauert weniger Zeit, um den Fall zu erkennen, wenn das Muster nicht übereinstimmt.
  • $ - das Ende der Zeichenfolge.

Daher entspricht der reguläre Ausdruck so viel Whitespace wie möglich, dh es folgt direkt auf das Ende des Strings: mit anderen Worten der nachfolgende Whitespace.

Die Investition in das Lernen regulärer Ausdrücke wird wertvoller, wenn Sie Ihre Anforderungen später erweitern müssen.

Verweise

54

Eine andere Option ist die Verwendung von Apache Commons StringUtils, insbesondere StringUtils.stripEnd

String stripped = StringUtils.stripEnd("   my lousy string    "," ");
11
Tim Bender

Ich habe die ursprüngliche Java.lang.String.trim()-Methode ein wenig geändert und es sollte funktionieren:

  public String trim(String str) {
        int len = str.length();
        int st = 0;

        char[] val = str.toCharArray();

        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        return str.substring(st, len);
    }

Prüfung:

  Test test = new Test();
  String sample = "            Hello World               "; // A String with trailing and leading spaces
  System.out.println(test.trim(sample) + " // No trailing spaces left");

Ausgabe:

        Hello World // No trailing spaces left
9
Ahmad

Die praktischste Antwort ist @ Micha's, Ahmad ist umgekehrt von dem, was Sie so wollten Ich habe mir aber folgendes ausgedacht, falls Sie es vorziehen, keine unbekannten Werkzeuge zu verwenden oder einen konkreten Ansatz zu sehen.

public String trimEnd( String myString ) {

    for ( int i = myString.length() - 1; i >= 0; --i ) {
        if ( myString.charAt(i) == ' ' ) {
            continue;
        } else {
            myString = myString.substring( 0, ( i + 1 ) );
            break;
        }
    }
    return myString;
}

Verwendet wie:

public static void main( String[] args ) {

    String s = "    Some text here   ";
    System.out.println( s + "|" );
    s = trimEnd( s );
    System.out.println( s + "|" );
}

Ausgabe:

Some text here   |
Some text here|
3
ChiefTwoPencils

Der beste Weg meiner Meinung nach:

public static String trimEnd(String source) {
    int pos = source.length() - 1;
    while ((pos >= 0) && Character.isWhitespace(source.charAt(pos))) {
        pos--;
    }
    pos++;
    return (pos < source.length()) ? source.substring(0, pos) : source;
}

Dadurch wird kein temporäres Objekt für die Ausführung des Jobs zugewiesen und es ist schneller als mit einem regulären Ausdruck. Es entfernt auch alle Leerzeichen, nicht nur ''.

1
BladeCoder

Hier ist eine sehr kurze, effiziente und leicht lesbare Version:

public static String trimTrailing(String str) {
    if (str != null) {
        for (int i = str.length() - 1; i >= 0; --i) {
            if (str.charAt(i) != ' ') {
                return str.substring(0, i + 1);
            }
        }
    }
    return str;
}

Alternativ zu str.charAt(i) != ' ' können Sie !Character.isWhitespace(str.charAt(i) auch verwenden, wenn Sie eine breitere Definition von Whitespace verwenden möchten.

1
peterh

Ab JDK11 können Sie stripTrailing verwenden:

String result = str.stripTrailing();
0
Aomine

Dieser Code soll so leicht wie möglich gelesen werden, indem beschreibende Namen verwendet werden (und reguläre Ausdrücke vermieden werden).

Es verwendet die Optional von Java 8 und ist daher nicht für jeden geeignet.

public static String removeTrailingWhitspace(String string) {
    while (hasWhitespaceLastCharacter(string)) {
        string = removeLastCharacter(string);
    }
    return string;
}

private static boolean hasWhitespaceLastCharacter(String string) {
    return getLastCharacter(string)
            .map(Character::isWhitespace)
            .orElse(false);
}

private static Optional<Character> getLastCharacter(String string) {
    if (string.isEmpty()) {
        return Optional.empty();
    }
    return Optional.of(string.charAt(string.length() - 1));
}

private static String removeLastCharacter(String string) {
    if (string.isEmpty()) {
        throw new IllegalArgumentException("String must not be empty");
    }
    return string.substring(0, string.length() - 1);
}
0
James Baker

String value = "Willkommen bei Java";

Also können wir verwenden 

value = value.trim ();

0
Pintu

Spring Framework gibt ein nützliches org.springframework.util.StringUtils. 

trimTrailingWhitespace

0
Jacky