Quelle est une bonne alternative aux fonctions JavaScript ltrim()
et rtrim()
en Java?
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.
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"
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*/" ");
}
La goyave a CharMatcher trimLeadingFrom et trimTrailingFrom
par exemple. CharMatcher.whitespace.trimTrailingFrom(s)
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
.