2013-03-22 26 views
32

Giải pháp thay thế tốt cho JavaScript ltrim()rtrim() hoạt động trong Java là gì?Giải pháp thay thế LTRIM và RTRIM trong Java là gì?

+0

Tôi sẽ chỉ cho bạn tại Commons Lang StringUtils, nhưng chúng không có ltrim/rtrim (hoặc lstrip/rstrip). +1 rồi ... – Thilo

+0

@Thilo, đúng vậy. Xem chỉnh sửa cuối cùng của tôi cho câu trả lời của tôi. – bezmax

+0

@Max: Cảm ơn, niềm tin vào thư viện yêu thích của tôi đã được khôi phục. – Thilo

Trả lời

39

Với một regex bạn có thể viết:

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

Nếu bạn phải làm điều đó thường xuyên, bạn có thể tạo và biên dịch một mô hình cho hiệu suất tốt hơn:

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

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

Từ một buổi biểu diễn quan điểm, một chương trình điểm chuẩn vi mô nhanh (bài viết JIT biên dịch) rằng phương pháp regex chậm hơn khoảng 5 lần so với vòng lặp (0.49s so với 0.11s cho 1 triệu ltrim).

Cá nhân tôi tìm thấy cách tiếp cận regex dễ đọc hơn và ít bị lỗi hơn nhưng nếu hiệu suất là một vấn đề bạn nên sử dụng giải pháp vòng lặp.

+8

'replaceFirst' là tốt hơn – leventov

27

Sử dụng regex có thể được tốt đẹp, nhưng nó chậm hơn khá nhiều so với một chức năng cắt tỉa đơn giản:

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

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

Ngoài ra, có một số thư viện cung cấp các chức năng như vậy. Ví dụ: Spring StringUtils. Apache Commons StringUtils cung cấp chức năng tương tự quá: strip, stripStart, stripEnd

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

+1. Tôi sẽ không gọi đây là "cắt" mặc dù, bởi vì chuỗi # trim không cắt khoảng trắng, nó cắt tỉa các ký tự điều khiển và một số khoảng trống chỉ ASCII. Commons Lang gọi phiên bản của họ (mà làm những gì bạn làm và những gì mọi người có thể muốn) "dải". – Thilo

+0

+1 khác nếu tôi có thể cho liên kết đến StringUtils trong Spring, có "trimLeadingWhitespace". – Thilo

+1

Có, @Thilo là đúng. Để làm cho nó hoạt động như hàm java trim gốc, chỉ cần thay đổi điều kiện thành 's.charAt (i) <= '''. – bezmax

1

Dựa trên câu trả lời của @bezmax tôi đã có một cái nhìn tại các mùa xuân StringUtils, nhưng nó không thể biện minh cho tình trạng quá tải cho tôi về việc chuyển đổi sang khuôn khổ mùa xuân. Vì vậy, tôi quyết định tạo ra một lớp Characters để dễ dàng trái/phải cắt dây cho bất kỳ ký tự nào (lớp). Lớp học có sẵn trên GitHub.

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

Nếu bạn muốn cắt cho khoảng trắng, có một xác định trước nhân vật đẳng cấp sẵn:

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

Lớp thực hiện tính năng cũng loại khác của các hoạt động nhân vật, chẳng hạn condense, replace hoặc 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

Ổi có CharMatcher trimLeadingFrom và trimTrailingFrom

ví dụ CharMatcher.whitespace.trimTrailingFrom(s)

Các vấn đề liên quan