2010-02-04 35 views
119

Trong Java, tôi có một chuỗi như thế này:Java String.trim() sẽ xóa bao nhiêu khoảng trắng?

"  content  ". 

Will String.trim() loại bỏ tất cả các không gian bằng các bên hoặc chỉ là một không gian trên mỗi?

+196

Đối với người downvoters: hành vi của bạn là tuyệt đối. Câu hỏi này chi tiết và cụ thể, được viết rõ ràng và đơn giản, sự quan tâm đến ít nhất một lập trình viên khác ở đâu đó. Mọi người có thể không biết tìm ở đâu để tìm javadoc hoặc mã nguồn. Công việc của chúng tôi là giúp đỡ họ, không bashing họ vì không biết gì. – glmxndr

+14

@subtenante, bạn đã đúng. Tôi thậm chí đã bảo vệ mọi người vì đã hỏi những câu hỏi của Google trước đây. Tuy nhiên, một cái gì đó đơn giản như điều này nên được thử nghiệm trên của riêng mình, và IMO, KHÔNG BAO GIỜ nên đảm bảo đăng một câu hỏi trên một trang web Hỏi & Đáp. Tiêu đề là gây hiểu lầm và Q là một sự lãng phí thời gian cho tất cả những người đọc nó. – Chris

+9

@Chris: oneat đã cho tôi dịp xem mã nguồn. Tôi đã học được rất nhiều về trim(). Tôi sẽ không có cách nào khác. Mọi người đều chịu trách nhiệm cho việc chi tiêu thời gian của mình. oneat không phải là để được đổ lỗi cho chúng tôi không thể có được lợi nhuận từ câu hỏi dường như ngây thơ của mình. – glmxndr

Trả lời

170

All of them.

Returns: Một bản sao của chuỗi này với ở đầu và đuôi không gian trắng xóa, hay chuỗi này nếu nó không có hàng đầu hoặc dấu khoảng trắng.

~ Trích dẫn từ Java 1.5.0 docs

(Nhưng tại sao bạn không chỉ cần thử nó và xem cho chính mình?)

+1

Tôi đã bỏ phiếu xuống vì câu trả lời này không bao gồm những gì tài liệu có nghĩa là "khoảng trắng". Nó có vẻ hợp lý rằng nó sẽ là nơi 'Chararacter.isWhitespace' là đúng, nhưng đó là * không * ý nghĩa của nó là" khoảng trắng ".. – user2864740

+7

@ user2864740: Câu trả lời này không có ý định là một phân tích toàn diện về 'trim ',' isWhiteSpace', hoặc một cuộc thảo luận về sự mơ hồ trong các tài liệu Java; đó là câu trả lời đơn giản cho câu hỏi cụ thể được hỏi ở trên - tức là, phương thức 'trim' có xóa một không gian đơn lẻ hoặc nhiều không gian không? – LukeH

+0

Tôi biết là không. Tôi đã bỏ phiếu vì nó không chỉ ra được, ngay cả khi đi qua. Trong mọi trường hợp, tôi không thể hoàn tác phiếu bầu của mình trừ khi nó được cập nhật (tuy nhiên tối thiểu). – user2864740

2

Nó sẽ xóa tất cả các khoảng trống trên cả hai mặt.

3

trim() sẽ xóa tất cả khoảng trống đầu và cuối. Nhưng lưu ý: Chuỗi của bạn không thay đổi. trim() sẽ trả về một thể hiện chuỗi mới thay thế.

+0

Nó sẽ loại bỏ tất cả khoảng trắng ở đầu và cuối * – EJP

0

Trim() làm việc cho cả hai hai bên.

33

Từ mã nguồn (dịch ngược):

public String trim() 
    { 
    int i = this.count; 
    int j = 0; 
    int k = this.offset; 
    char[] arrayOfChar = this.value; 
    while ((j < i) && (arrayOfChar[(k + j)] <= ' ')) 
     ++j; 
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' ')) 
     --i; 
    return (((j > 0) || (i < this.count)) ? substring(j, i) : this); 
    } 

Hai while mà bạn có thể nhìn thấy nghĩa là tất cả các nhân vật mà unicode là dưới nhân vật không gian, tại đầu và cuối, được loại bỏ.

27

Khi nghi ngờ, hãy viết một bài kiểm tra đơn vị:

@Test 
public void trimRemoveAllBlanks(){ 
    assertThat(" content ".trim(), is("content")); 
} 

NB: dĩ nhiên là thử nghiệm (đối với JUnit + hamcrest) không thất bại

+42

Yêu cầu một lập trình viên mới chỉ học cách làm System.out.println để thực hiện kiểm tra đơn vị để xem kết quả là gì ... – jaxkodex

15

Xem API cho lớp String:

Trả về một bản sao của chuỗi, với khoảng trống đầu và cuối được bỏ qua.

Khoảng trắng ở hai bên được lấy ra:

Lưu ý rằng trim() không thay đổi ví dụ String, nó sẽ trả về một đối tượng mới:

String original = " content "; 
String withoutWhitespace = original.trim(); 

// original still refers to " content " 
// and withoutWhitespace refers to "content" 
+1

thực sự không có gì có thể thay đổi thể hiện String (ngoại trừ một số thứ bẩn có thể làm hỏng VM) – AvrDragon

0

Javadoc cho String có tất cả các chi tiết. Loại bỏ không gian màu trắng (không gian, tab, vv) từ cả hai đầu và trả về một chuỗi mới.

0

Nếu bạn muốn kiểm tra những gì sẽ làm một số phương pháp, bạn có thể sử dụng BeanShell. Nó là một ngôn ngữ kịch bản được thiết kế để càng gần Java càng tốt. Nói chung nó được giải thích Java với một số thư giãn. Một tùy chọn khác thuộc loại này là Groovy ngôn ngữ. Cả hai ngôn ngữ kịch bản này đều cung cấp vòng lặp Đọc-Đánh giá thuận tiện biết từ các ngôn ngữ thông dịch.Vì vậy, bạn có thể chạy giao diện điều khiển và chỉ cần loại:

"  content  ".trim(); 

Bạn sẽ thấy "content" kết quả là sau khi nhấn Enter (hoặc Ctrl+R trong giao diện điều khiển Groovy).

+5

Vì vậy, để hiểu một phương pháp trong Java, anh ta nên học một ngôn ngữ hoàn toàn mới. Có thật không? –

25

Một điều cần lưu ý là String.trim có định nghĩa đặc biệt về "khoảng trống". Nó không loại bỏ khoảng trắng Unicode, mà còn loại bỏ các ký tự điều khiển ASCII mà bạn có thể không xem xét khoảng trắng.

Phương pháp này có thể được sử dụng để cắt khoảng trắng từ đầu và cuối của chuỗi; trên thực tế, nó cũng trims tất cả các ký tự điều khiển ASCII.

Nếu có thể, bạn có thể muốn sử dụng StringUtils.strip() của Commons Lang, cũng xử lý khoảng trắng Unicode (và cũng không an toàn).

+2

Có vẻ như một sự giám sát khủng khiếp trên phần thiết kế .. và công việc quá kỹ thuật quá mức của tài liệu này không giúp được gì nhiều. – user2864740

+1

Bravo! Bạn lấy câu hỏi đơn giản nhất từng được hỏi về StackOverflow và tìm thấy một cái gì đó thông minh để nói về nó. Bạn là một tín dụng cho cuộc đua. –

+3

@MarkMcKenna: Tôi tiếp tục tìm kiếm những câu hỏi lập trình được cho là siêu đơn giản này (cắt xén chuỗi, tìm phần mở rộng tên tệp, v.v.) * luôn luôn * có sự phức tạp ẩn của chúng. Đó là một chút thất vọng về nghề thủ công và công cụ của chúng tôi. – Thilo

2

Một điều rất quan trọng là chuỗi được tạo hoàn toàn bằng "khoảng trắng" sẽ trả về một chuỗi trống.

nếu số string sSomething = "xxxxx", trong đó x đứng cho khoảng trắng, sSomething.trim() sẽ trả lại một chuỗi trống.

nếu số string sSomething = "xxAxx", trong đó x đứng cho khoảng trắng, sSomething.trim() sẽ trả lại A.

nếu sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim() sẽ trả về SomethingxxxxAndSomethingxElse, lưu ý rằng số lượng x giữa các từ không bị thay đổi.

Nếu bạn muốn một chuỗi đóng gói gọn gàng kết hợp trim() với regex như được hiển thị trong bài đăng này: How to remove duplicate white spaces in string using Java?.

Thứ tự là vô nghĩa đối với kết quả nhưng trim() trước tiên sẽ hiệu quả hơn. Hy vọng nó giúp.

-1
String formattedStr=unformattedStr; 
formattedStr=formattedStr.trim().replaceAll("\\s+", " "); 
+0

Điều này không liên quan đến câu hỏi. –

+1

@Mark nhưng vô tình nó là những gì tôi đang tìm kiếm khi tôi mở câu hỏi này ... – Armfoot

+0

Nó cũng là vô nghĩa. 'trim()' đã làm những gì 'repkaceAll()' sẽ làm, nếu có bất cứ điều gì còn lại để nó làm. – EJP

4

Từ tài liệu java (String nguồn lớp),

/** 
* Returns a copy of the string, with leading and trailing whitespace 
* omitted. 
* <p> 
* If this <code>String</code> object represents an empty character 
* sequence, or the first and last characters of character sequence 
* represented by this <code>String</code> object both have codes 
* greater than <code>'&#92;u0020'</code> (the space character), then a 
* reference to this <code>String</code> object is returned. 
* <p> 
* Otherwise, if there is no character with a code greater than 
* <code>'&#92;u0020'</code> in the string, then a new 
* <code>String</code> object representing an empty string is created 
* and returned. 
* <p> 
* Otherwise, let <i>k</i> be the index of the first character in the 
* string whose code is greater than <code>'&#92;u0020'</code>, and let 
* <i>m</i> be the index of the last character in the string whose code 
* is greater than <code>'&#92;u0020'</code>. A new <code>String</code> 
* object is created, representing the substring of this string that 
* begins with the character at index <i>k</i> and ends with the 
* character at index <i>m</i>-that is, the result of 
* <code>this.substring(<i>k</i>,&nbsp;<i>m</i>+1)</code>. 
* <p> 
* This method may be used to trim whitespace (as defined above) from 
* the beginning and end of a string. 
* 
* @return A copy of this string with leading and trailing white 
*   space removed, or this string if it has no leading or 
*   trailing white space. 
*/ 
public String trim() { 
int len = count; 
int st = 0; 
int off = offset;  /* avoid getfield opcode */ 
char[] val = value; /* avoid getfield opcode */ 

while ((st < len) && (val[off + st] <= ' ')) { 
    st++; 
} 
while ((st < len) && (val[off + len - 1] <= ' ')) { 
    len--; 
} 
return ((st > 0) || (len < count)) ? substring(st, len) : this; 
} 

Lưu ý rằng sau khi bắt đầu và thời gian mà họ gọi là phương pháp chuỗi con của lớp String.

+0

Trường hợp "khoảng trống" là "các ký tự có giá trị nhỏ hơn hoặc bằng \ x20" .. rực rỡ. – user2864740

13

Dựa trên tài liệu Java here, số .trim() thay thế '\ u0020' thường được gọi là khoảng trắng.

Nhưng lưu ý rằng '\ u00A0' (Unicode NO-BREAK SPACE&nbsp;) cũng được xem là khoảng trắng và .trim() sẽ KHÔNG loại bỏ điều này. Điều này đặc biệt phổ biến trong HTML.

Để loại bỏ nó, tôi sử dụng:

tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", ""); 

Một ví dụ về vấn đề này đã được thảo luận here.

+0

Dựa trên Javadoc, nó xóa * khoảng trắng đầu và cuối, * bao gồm dấu cách, tab, dòng trả về dòng mới, nguồn cấp dữ liệu biểu mẫu, ... và * loại trừ * các ký tự không dẫn đầu hoặc theo sau. – EJP

+0

Cảm ơn, nó giúp tôi allot –

8

Ví dụ về Java trim() không gian loại bỏ:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     String str = "\n\t This is be trimmed.\n\n"; 

     String newStr = str.trim();  //removes newlines, tabs and spaces. 

     System.out.println("old = " + str); 
     System.out.println("new = " + newStr); 
    } 
} 

OUTPUT

old = 
This is a String. 


new = This is a String. 
2

Để giữ chỉ một ví dụ cho String, bạn có thể sử dụng như sau.

str = " Hello "; 

hoặc

str = str.trim(); 

Sau đó, giá trị của str String, sẽ str = "Hello"

3

Nếu chuỗi đầu vào của bạn là:

String a = " abc "; 
System.out.println(a); 

Vâng, đầu ra sẽ được, " abc "; Nhưng nếu chuỗi đầu vào của bạn là:

String b = " This is a test " 
System.out.println(b); 

Output sẽ This is a test Vì vậy, cắt chỉ loại bỏ khoảng trống trước khi ký tự đầu tiên của bạn và sau khi ký tự cuối cùng của bạn trong chuỗi và bỏ qua các không gian bên trong. Đây là một đoạn mã của tôi hơi tối ưu hóa phương pháp cắt được xây dựng trong String xóa các khoảng trắng bên trong và xóa dấu cách trước và sau ký tự đầu tiên và cuối cùng của bạn trong chuỗi. Hy vọng nó giúp.

public static String trim(char [] input){ 
    char [] output = new char [input.length]; 
    int j=0; 
    int jj=0; 
    if(input[0] == ' ') { 
     while(input[jj] == ' ') 
      jj++;  
    } 
    for(int i=jj; i<input.length; i++){ 
     if(input[i] !=' ' || (i==(input.length-1) && input[input.length-1] == ' ')){ 
     output[j]=input[i]; 
     j++; 
     } 
     else if (input[i+1]!=' '){ 
     output[j]=' '; 
     j++; 
     }  
    } 
    char [] m = new char [j]; 
    int a=0; 
    for(int i=0; i<m.length; i++){ 
     m[i]=output[a]; 
     a++; 
    } 
    return new String (m); 
    } 
+0

Đầu tiên vài câu trong câu trả lời này là đồng bằng sai, đầu ra sẽ * không * được "abc". Có lẽ bạn đã quên '.trim()' trong 'System.out.println (a);'? – Arjan

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