2013-03-22 16 views
32

Java'da JavaScript ltrim() ve rtrim() işlevlerinin iyi bir alternatifi nedir? Sık sık bunu yapmak için varsa oluşturabilir,Java'da LTRIM ve RTRIM'in iyi bir alternatifi nedir?

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

ve daha iyi performans için bir model derlemek: Bir regex ile

+0

Ben sizi Commons Lang StringUtils'e yönlendirecektim, ancak bunlar ltrim/rtrim (veya lstrip/rstrip) içermiyor. +1 o zaman ... – Thilo

+0

@Thilo, evet yaparlar. Son düzenlememi yanıtıma bakın. – bezmax

+0

@Max: Teşekkürler, en sevdiğim kitaplıktaki inanç geri yüklendi. – Thilo

cevap

39

yazabilirsiniz bir performans itibaren

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

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

perspektif, hızlı bir mikro benchmark gösterir (post JIT derleme) regex yaklaşım döngüden yaklaşık 5 kat daha yavaş olduğunu gösterir (1 milyon ltrim için 0.49 vs 0.11s).

Kişisel olarak regex yaklaşımını daha okunaklı ve daha az hataya eğilimli olarak buluyorum ancak performans sorun çıkarsa döngü çözümünü kullanmalısınız.

+8

'replaceFirst' ise daha iyi – leventov

27

regex kullanarak güzel ama basit bir kırparak fonksiyonları daha oldukça çok yavaş olduğunu olabilir:

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

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

Ayrıca, bu tür fonksiyonları sağlayan bazı kütüphaneler vardır. Örneğin, Spring StringUtils. Apache Commons StringUtils çok benzer işlevler sunar: strip, stripStart, stripEnd Ben Bahar StringUtils bir göz vardı @bezmax cevabı dayanarak

StringUtils.stripEnd("abc ", null) = "abc" 
+4

+1. Buna rağmen "trim" diyemem, çünkü String # trim beyaz boşlukları kırpmıyor, kontrol karakterlerini ve sadece ASCII sadece beyaz boşluğu düzeltir. Commons Lang kendi versiyonunu çağırır (bu sizin yaptığınız şeyi yapar ve herkesin istediği şeyi yapar) "strip". – Thilo

+0

Spring'te "trimLeadingWhitespace" olan StringUtils bağlantısına bir tane daha ekleyebilir miyim? – Thilo

+1

Evet, @ Thao haklı. Orijinal java trim fonksiyonu gibi çalışmasını sağlamak için 's.charAt (i) <=' ''koşulunu değiştirin. – bezmax

1

ama Bahar çerçevesine anahtarlama benim için aşırı haklı olamazdı. Bu nedenle, herhangi bir karakter (-class) için kolayca sol/sağ trim dizilerine Characters sınıfı oluşturmaya karar verdim. Sınıf GitHub'da kullanılabilir.

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

Eğer beyaz alanlara Döşeme istiyorsanız

, mevcut önceden tanımlanmış karakter sınıfı vardır:

sınıfı da özellik karakter operasyonların diğer türlü condense, replace ya split böyle yapar
Characters.WHITESPACE.trim(...) 
Characters.WHITESPACE.leftTrim(...) 
Characters.WHITESPACE.rightTrim(...) 

.

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 CharMatcher trimLeadingFrom sahip trimTrailingFrom

ör CharMatcher.whitespace.trimTrailingFrom(s)

İlgili konular