web-dev-qa-db-fra.com

Quelle est une bonne alternative de LTRIM et RTRIM en Java?

Quelle est une bonne alternative aux fonctions JavaScript ltrim() et rtrim() en Java?

45
yegor256

Avec une expression régulière, vous pouvez écrire:

String s = ...
String ltrim = s.replaceAll("^\\s+","");
String rtrim = s.replaceAll("\\s+$","");

Si vous devez le faire souvent, vous pouvez créer et compiler un modèle pour de meilleures performances:

private final static Pattern LTRIM = Pattern.compile("^\\s+");

public static String ltrim(String s) {
    return LTRIM.matcher(s).replaceAll("");
}

Du point de vue des performances, un micro-benchmark rapide montre (après la compilation JIT) que l'approche regex est environ 5 fois plus lente que la boucle (0,49s contre 0,11s pour 1 million de ltrim).

Personnellement, je trouve l'approche regex plus lisible et moins sujette aux erreurs, mais si les performances sont un problème, vous devriez utiliser la solution de boucle.

47
assylias

Utiliser l'expression régulière peut être agréable, mais c'est beaucoup plus lent qu'une simple fonction de découpage:

public static String ltrim(String s) {
    int i = 0;
    while (i < s.length() && Character.isWhitespace(s.charAt(i))) {
        i++;
    }
    return s.substring(i);
}

public static String rtrim(String s) {
    int i = s.length()-1;
    while (i >= 0 && Character.isWhitespace(s.charAt(i))) {
        i--;
    }
    return s.substring(0,i+1);
}

Source: http://www.fromdev.com/2009/07/playing-with-Java-string-trim-basics.html

De plus, certaines bibliothèques proposent de telles fonctions. Par exemple, Spring StringUtils . Apache Commons StringUtils fournit également des fonctions similaires: strip, stripStart, stripEnd

StringUtils.stripEnd("abc  ", null)    = "abc"
29
bezmax
import org.Apache.commons.lang3.StringUtils;

private String rTrim(String str) {
    return StringUtils.stripEnd(str, /*stripChars*/" ");
}

private String lTrim(String str) {
    return StringUtils.stripStart(str, /*stripChars*/" ");
}
6
Yanniel

La goyave a CharMatcher trimLeadingFrom et trimTrailingFrom

par exemple. CharMatcher.whitespace.trimTrailingFrom(s)

2
Andrew McKinlay

Sur la base de la réponse de @bezmax, j'ai jeté un œil au Spring StringUtils , mais cela ne pouvait pas justifier la surcharge pour moi de passer au framework Spring. J'ai donc décidé de créer une classe Characters pour couper facilement les chaînes gauche/droite pour n'importe quel caractère (-classe). La classe est disponible sur GitHub .

Characters.valueOf('x').trim( ... )
Characters.valueOf('x').leftTrim( ... )
Characters.valueOf('x').rightTrim( ... )

Si vous souhaitez réduire les espaces blancs, une classe de caractères prédéfinie est disponible:

Characters.WHITESPACE.trim( ... )
Characters.WHITESPACE.leftTrim( ... )
Characters.WHITESPACE.rightTrim( ... )

La classe comporte également d'autres types d'opérations sur les caractères, tels que condense, replace ou split.

1
Kristian Kraljic