2010-01-18 92 views
42

Làm cách nào để cắt các ký tự trong Java?
ví dụ:Cắt các ký tự trong Java

String j = “\joe\jill\”.Trim(new char[] {“\”}); 

j nên

"joe \ jill"

String j = “jack\joe\jill\”.Trim("jack"); 

j nên

"\ joe \ jill \"

vv

+0

Điều gì sẽ '\\\\ joe \\ jill \\\\\\\\\\\\\\ should should should should return return return return return return return return return return return return return? 'joe \\ jill' ?? – OscarRyz

+0

@Oscar yes. Giống như cắt trong .net –

+10

Tôi không nghĩ rằng hoạt động này được gọi là cắt tỉa ... – Esko

Trả lời

70

Apache Commons có số lượng lớn StringUtils class. Trong StringUtils, có một phương thức strip(String, String) sẽ thực hiện những gì bạn muốn.

Tôi thực sự khuyên bạn nên sử dụng Apache Commons, đặc biệt là thư viện Bộ sưu tập và thư viện Lang.

+0

Giải pháp thực sự tốt đẹp. –

0

EDIT: Sửa đổi bởi câu trả lời để thay thế chỉ là '\' ký tự đầu tiên và cuối cùng.

System.err.println("\\joe\\jill\\".replaceAll("^\\\\|\\\\$", "")); 
0

Tôi không nghĩ rằng có bất kỳ chức năng tích hợp nào để cắt dựa trên chuỗi được truyền. Đây là một ví dụ nhỏ về cách thực hiện điều này. Đây không phải là giải pháp hiệu quả nhất, nhưng nó có thể đủ nhanh cho hầu hết các tình huống, đánh giá và thích ứng với nhu cầu của bạn. Tôi khuyên bạn nên kiểm tra hiệu suất và tối ưu hóa khi cần thiết cho bất kỳ đoạn mã nào sẽ được sử dụng thường xuyên. Dưới đây, tôi đã bao gồm một số thông tin thời gian làm ví dụ.

public String trim(String stringToTrim, String stringToRemove) 
{ 
    String answer = stringToTrim; 

    while(answer.startsWith(stringToRemove)) 
    { 
     answer = answer.substring(stringToRemove.length()); 
    } 

    while(answer.endsWith(stringToRemove)) 
    { 
     answer = answer.substring(0, answer.length() - stringToRemove.length()); 
    } 

    return answer; 
} 

Câu trả lời này giả định rằng các ký tự được cắt là một chuỗi. Ví dụ: chuyển vào "abc" sẽ cắt "abc" chứ không phải "bbc" hoặc "cba", v.v.

Một số lần thực hiện để chạy mỗi 10 triệu lần sau.

" mile ".trim(); chạy trong 248 ms được bao gồm dưới dạng triển khai tham chiếu để so sánh hiệu suất.

trim("smiles", "s"); chạy trong 547 ms - khoảng 2 lần miễn là phương pháp String.trim() của java.

"smiles".replaceAll("s$|^s",""); chạy trong 12,306 ms - khoảng 48 lần miễn là phương thức String.trim() của java.

Và sử dụng mẫu regex được biên soạn Pattern pattern = Pattern.compile("s$|^s"); pattern.matcher("smiles").replaceAll(""); chạy trong 7,804 ms - khoảng 31 lần miễn là phương pháp String.trim() của java.

+0

"answer.length - trimChar.length - 1" thực sự –

+0

Không thực sự được tối ưu hóa. Tôi sẽ không sử dụng cái này. – Pindatjuh

+0

tại sao không sử dụng regex? –

0

dường như không có sẵn sàng để sử dụng java api mà làm cho điều đó nhưng bạn có thể viết một phương pháp để làm điều đó cho bạn. link này có thể có ích

+0

Regex là api sẵn sàng để sử dụng :-) –

+0

chắc chắn nó là: D tôi có nghĩa là một chức năng cắt có chuỗi như câu hỏi nói –

33

này làm những gì bạn muốn:

public static void main (String[] args) { 
    String a = "\\joe\\jill\\"; 
    String b = a.replaceAll("\\\\$", "").replaceAll("^\\\\", ""); 
    System.out.println(b); 
} 

Các $ được sử dụng để loại bỏ các chuỗi vào cuối chuỗi. Các ^ được sử dụng để loại bỏ trong beggining.

Là một thay thế, bạn có thể sử dụng cú pháp:

String b = a.replaceAll("\\\\$|^\\\\", ""); 

Các | có nghĩa là "hay".

Trong trường hợp bạn muốn cắt chars khác, chỉ cần thích ứng với regex:

String b = a.replaceAll("y$|^x", ""); // will remove all the y from the end and x from the beggining 
+0

Tôi nghĩ rằng bạn cần phải thêm '\\', tức là '" \\ y $ |^\\ x "' – EricG

1

Bạn có thể sử dụng removeStartremoveEnd từ Apache Commons Lang StringUtils

0

tay thực hiện cho các tùy chọn đầu tiên:

public class Rep { 
    public static void main(String [] args) { 
     System.out.println(trimChar('\\' , "\\\\\\joe\\jill\\\\\\\\") ) ; 
     System.out.println(trimChar('\\' , "joe\\jill") ) ; 
    } 
    private static String trimChar(char toTrim, String inString) { 
     int from = 0; 
     int to = inString.length(); 

     for(int i = 0 ; i < inString.length() ; i++) { 
      if(inString.charAt(i) != toTrim) { 
       from = i; 
       break; 
      } 
     } 
     for(int i = inString.length()-1 ; i >= 0 ; i--){ 
      if(inString.charAt(i) != toTrim){ 
       to = i; 
       break; 
      } 
     } 
     return inString.substring(from , to); 
    } 
} 

In

joe\jil

joe\jil

+2

umh .. một bình luận xin vui lòng trên downvote? – OscarRyz

0

Tôi thực sự sẽ viết chức năng nhỏ của riêng tôi mà không lừa bằng cách sử dụng đồng bằng cũ truy cập char:

public static String trimBackslash(String str) 
{ 
    int len, left, right; 
    return str == null || (len = str.length()) == 0 
          || ((left = str.charAt(0) == '\\' ? 1 : 0) | 
      (right = len > left && str.charAt(len - 1) == '\\' ? 1 : 0)) == 0 
     ? str : str.substring(left, len - right); 
} 

này hoạt động tương tự như những gì String.trim() thực hiện, chỉ nó hoạt động với '\' thay vì không gian.

Dưới đây là một phương án thay thế hoạt động và thực sự sử dụng trim(). ;) Althogh nó không phải là rất hiệu quả nó có lẽ sẽ đánh bại tất cả các phương pháp tiếp cận dựa trên regexp hiệu quả khôn ngoan.

String j = “\joe\jill\”; 
j = j.replace('\\', '\f').trim().replace('\f', '\\'); 
18

CharMatcher - Google Ổi

Trong quá khứ, tôi muốn thứ hai Colins’ Apache commons-lang answer. Nhưng bây giờ mà Google của guava-libraries được phát hành, lớp CharMatcher sẽ làm những gì bạn muốn khá độc đáo:

String j = CharMatcher.is('\\').trimFrom("\\joe\\jill\\"); 
// j is now joe\jill 

CharMatcher có một bộ rất đơn giản và mạnh mẽ của API cũng như một số các hằng số được xác định trước mà làm cho thao tác rất dễ dàng. Ví dụ:

CharMatcher.is(':').countIn("a:b:c"); // returns 2 
CharMatcher.isNot(':').countIn("a:b:c"); // returns 3 
CharMatcher.inRange('a', 'b').countIn("a:b:c"); // returns 2 
CharMatcher.DIGIT.retainFrom("a12b34"); // returns "1234" 
CharMatcher.ASCII.negate().removeFrom("a®¶b"); // returns "ab"; 

Rất đẹp.

+0

Hãy xem [CharMatcher] (http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/CharMatcher.html) trong Google Guava. Slick stuff. Sử dụng cú pháp Predicate thông minh. Giúp bạn dễ dàng xác định các định nghĩa khác nhau về các ký tự khoảng trắng, ẩn và kiểm soát mà bạn có trong đầu. Tài liệu liên kết đến một bảng tính thú vị liệt kê một số [định nghĩa khác nhau về khoảng trắng] (https://spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ). –

0

Đây là cách tôi sẽ thực hiện.

Tôi nghĩ nó hiệu quả về mặt lý tưởng. Nó tối ưu hóa trường hợp ký tự đơn và tránh tạo nhiều bản chất cho mỗi chuỗi bị xóa.

Lưu ý rằng trường hợp góc để truyền chuỗi rỗng để cắt được xử lý (một số câu trả lời khác sẽ đi vào vòng lặp vô hạn).

/** Trim all occurrences of the string <code>rmvval</code> from the left and right of <code>src</code>. Note that <code>rmvval</code> constitutes an entire string which must match using <code>String.startsWith</code> and <code>String.endsWith</code>. */ 
static public String trim(String src, String rmvval) { 
    return trim(src,rmvval,rmvval,true); 
    } 

/** Trim all occurrences of the string <code>lftval</code> from the left and <code>rgtval</code> from the right of <code>src</code>. Note that the values to remove constitute strings which must match using <code>String.startsWith</code> and <code>String.endsWith</code>. */ 
static public String trim(String src, String lftval, String rgtval, boolean igncas) { 
    int         str=0,end=src.length(); 

    if(lftval.length()==1) {             // optimize for common use - trimming a single character from left 
     char chr=lftval.charAt(0); 
     while(str<end && src.charAt(str)==chr) { str++; } 
     } 
    else if(lftval.length()>1) {            // handle repeated removal of a specific character sequence from left 
     int vallen=lftval.length(),newstr; 
     while((newstr=(str+vallen))<=end && src.regionMatches(igncas,str,lftval,0,vallen)) { str=newstr; } 
     } 

    if(rgtval.length()==1) {             // optimize for common use - trimming a single character from right 
     char chr=rgtval.charAt(0); 
     while(str<end && src.charAt(end-1)==chr) { end--; } 
     } 
    else if(rgtval.length()>1) {            // handle repeated removal of a specific character sequence from right 
     int vallen=rgtval.length(),newend; 
     while(str<=(newend=(end-vallen)) && src.regionMatches(igncas,newend,rgtval,0,vallen)) { end=newend; } 
     } 

    if(str!=0 || end!=src.length()) { 
     if(str<end) { src=src.substring(str,end); }       // str is inclusive, end is exclusive 
     else  { src="";      } 
     } 

    return src; 
    } 
6

Dưới đây là một phi-regexp, phi siêu tuyệt vời, phi-super-tối ưu hóa, tuy nhiên rất dễ hiểu giải pháp phi bên ngoài-lib:

public static String trimStringByString(String text, String trimBy) { 
    int beginIndex = 0; 
    int endIndex = text.length(); 

    while (text.substring(beginIndex, endIndex).startsWith(trimBy)) { 
     beginIndex += trimBy.length(); 
    } 

    while (text.substring(beginIndex, endIndex).endsWith(trimBy)) { 
     endIndex -= trimBy.length(); 
    } 

    return text.substring(beginIndex, endIndex); 
} 

Cách sử dụng:

String trimmedString = trimStringByString(stringToTrim, "/"); 
0
public static String trim(String value, char c) { 

    if (c <= 32) return value.trim(); 

    int len = value.length(); 
    int st = 0; 
    char[] val = value.toCharArray(); /* avoid getfield opcode */ 

    while ((st < len) && (val[st] == c)) { 
     st++; 
    } 
    while ((st < len) && (val[len - 1] == c)) { 
     len--; 
    } 
    return ((st > 0) || (len < value.length())) ? value.substring(st, len) : value; 
} 
Các vấn đề liên quan