2013-03-22 11 views
32

Qual è una buona alternativa delle funzioni JavaScript ltrim() e rtrim() in Java?Qual è una buona alternativa di LTRIM e RTRIM in Java?

+0

Stavo per indicarti Commons Lang StringUtils, ma non hanno ltrim/rtrim (o lstrip/rstrip). +1 poi ... – Thilo

+0

@Thilo, sì, lo fanno. Guarda la mia ultima modifica alla mia risposta. – bezmax

+0

@Max: Grazie, ho ripristinato la fiducia nella mia libreria preferita. – Thilo

risposta

39

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.

+8

'replaceFirst' è migliore – leventov

27

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" 
+4

+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

+0

Un altro +1 se potessi il collegamento a StringUtils in Spring, che ha "trimLeadingWhitespace". – Thilo

+1

Sì, @Thilo ha ragione. Per farlo funzionare come la funzione di rifinitura java originale, basta cambiare il condizionale a 's.charAt (i) <= '''. – bezmax

1

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.

5
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*/" "); 
} 
0

Guava ha CharMatcher trimLeadingFrom e trimTrailingFrom

esempio CharMatcher.whitespace.trimTrailingFrom(s)

Problemi correlati