Qual è una buona alternativa delle funzioni JavaScript ltrim()
e rtrim()
in Java?Qual è una buona alternativa di LTRIM e RTRIM in Java?
risposta
Con un'espressione regolare si potrebbe scrivere:
String s = ...
String ltrim = s.replaceAll("^\\s+","");
String rtrim = s.replaceAll("\\s+$","");
Se dovete farlo spesso, è possibile creare e compilare un modello per migliorare le prestazioni:
private final static Pattern LTRIM = Pattern.compile("^\\s+");
public static String ltrim(String s) {
return LTRIM.matcher(s).replaceAll("");
}
Da una performance prospettiva, un rapido benchmark mostra (post compilazione JIT) che l'approccio regex è circa 5 volte più lento del ciclo (0,49s contro 0,11s per 1 milione ltrim).
Personalmente trovo l'approccio regex più leggibile e meno soggetto a errori, ma se le prestazioni sono un problema dovresti usare la soluzione loop.
'replaceFirst' è migliore – leventov
Utilizzando espressioni regolari può essere bello, ma è un bel po 'più lento rispetto a semplici funzioni di taglio:
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);
}
Fonte: http://www.fromdev.com/2009/07/playing-with-java-string-trim-basics.html
Inoltre, ci sono alcune librerie che forniscono tali funzioni. Ad esempio, Spring StringUtils. Apache Commons StringUtils fornisce funzioni simili anche: strip, stripStart, stripEnd
StringUtils.stripEnd("abc ", null) = "abc"
+1. Non chiamerei questo "assetto", perché String # non taglia gli spazi bianchi, taglia i caratteri di controllo e alcuni spazi bianchi solo per ASCII. Commons Lang chiama la loro versione (che fa quello che fai e quello che probabilmente tutti vogliono) "strip". – Thilo
Un altro +1 se potessi il collegamento a StringUtils in Spring, che ha "trimLeadingWhitespace". – Thilo
Sì, @Thilo ha ragione. Per farlo funzionare come la funzione di rifinitura java originale, basta cambiare il condizionale a 's.charAt (i) <= '''. – bezmax
Sulla base della risposta del @bezmax ho avuto uno sguardo alla primavera StringUtils
, ma non poteva giustificare la sovraccarico per me di passare al framework Spring. Pertanto ho deciso di creare una classe Characters
per stringere facilmente i left/right trim per ogni dato carattere (-class). La classe è disponibile su GitHub.
Characters.valueOf('x').trim(...)
Characters.valueOf('x').leftTrim(...)
Characters.valueOf('x').rightTrim(...)
Se volete tagliare per gli spazi bianchi, c'è una classe caratteri predefiniti disponibili:
Characters.WHITESPACE.trim(...)
Characters.WHITESPACE.leftTrim(...)
Characters.WHITESPACE.rightTrim(...)
La classe fa funzione anche altri tipi di operazioni di carattere, come condense
, replace
o split
.
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*/" ");
}
Guava ha CharMatcher trimLeadingFrom e trimTrailingFrom
esempio CharMatcher.whitespace.trimTrailingFrom(s)
Stavo per indicarti Commons Lang StringUtils, ma non hanno ltrim/rtrim (o lstrip/rstrip). +1 poi ... – Thilo
@Thilo, sì, lo fanno. Guarda la mia ultima modifica alla mia risposta. – bezmax
@Max: Grazie, ho ripristinato la fiducia nella mia libreria preferita. – Thilo