web-dev-qa-db-fra.com

Comment supprimer uniquement les espaces de fin d'une chaîne en Java et conserver les espaces de début?

La fonction trim() supprime à la fois les espaces de fin et de fin. Toutefois, si je souhaite uniquement supprimer l'espace de fin d'une chaîne, comment puis-je le faire?

37
kzjfr0

Depuis JDK 11

Si vous êtes sur JDK 11 ou supérieur, vous devriez probablement utiliser stripTrailing () .


Versions antérieures du JDK

En utilisant l'expression régulière \s++$, vous pouvez remplacer tous les caractères de fin de l'espace (y compris les espaces et les tabulations) par la chaîne vide ("").

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

Sortie

  foo

Démo en ligne.

Voici une ventilation de la regex:

  • \s - tout caractère blanc,
  • ++ - correspond à un ou plusieurs des jetons précédents (de manière possessive); c'est-à-dire correspondre à un ou plusieurs caractères d'espacement. Le modèle + est utilisé sous la forme possessif++, ce qui prend moins de temps pour détecter le cas où le modèle ne correspond pas.
  • $ - la fin de la chaîne.

Ainsi, l'expression régulière correspondra à autant d'espaces qu'elle suivra directement de la fin de la chaîne: en d'autres termes, les espaces de fin.

L'investissement dans l'apprentissage des expressions régulières deviendra plus précieux si vous devez étendre vos exigences ultérieurement.

Références

54
Micha Wiedenmann

Une autre option consiste à utiliser Apache Commons StringUtils, en particulier StringUtils.stripEnd

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

J'ai légèrement modifié la méthode Java.lang.String.trim() originale et cela devrait fonctionner:

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

Tester:

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

Sortie:

        Hello World // No trailing spaces left
9
Ahmad

La réponse la plus pratique est @ Micha's, Ahmad est l'inverse de ce que tu voulais donc Mais voici ce que j'ai proposé au cas où vous préféreriez ne pas utiliser d'outils inconnus ou voir une approche concrète.

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

Utilisé comme:

public static void main( String[] args ) {

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

Sortie:

Some text here   |
Some text here|
3
ChiefTwoPencils

La meilleure façon à mon avis:

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

Cela n'affecte aucun objet temporaire à l'exécution du travail et est plus rapide que l'utilisation d'une expression régulière. En outre, il supprime tous les espaces, pas seulement ''.

1
BladeCoder

Voici une version très courte, efficace et facile à lire:

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

Au lieu de str.charAt(i) != ' ', vous pouvez également utiliser !Character.isWhitespace(str.charAt(i) si vous souhaitez utiliser une définition plus large des espaces.

1
peterh

À partir du JDK11, vous pouvez utiliser stripTrailing :

String result = str.stripTrailing();
0
Aomine

Ce code est destiné à être lu aussi facilement que possible en utilisant des noms descriptifs (et en évitant les expressions régulières).

Il utilise la variable Optional de Java 8 et ne convient donc pas à tout le monde.

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 = "Bienvenue sur Java";

Donc on peut utiliser 

valeur = valeur.trim ();

0
Pintu

Le framework Spring fournit un org.springframework.util.StringUtils utile. 

trimTrailingWhitespace

0
Jacky