Java String.trim () sẽ xóa bao nhiêu khoảng trắng?


117

Trong Java, tôi có một chuỗi như thế này:

"     content     ".

Sẽ String.trim()loại bỏ tất cả các khoảng trắng trên các mặt này hay chỉ một khoảng trắng trên mỗi mặt?


197
Đối với những người phản đối: hành vi của bạn là hạ mình. Câu hỏi này rất chi tiết và cụ thể, được viết rõ ràng và đơn giản, được ít nhất một lập trình viên khác ở đâu đó quan tâm. Mọi người có thể không biết phải 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 phải đánh họ vì thiếu hiểu biết.
glmxndr

14
@subtenante, bạn nói đú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, những thứ đơn giản như thế này nên được tự mình kiểm tra và IMO, KHÔNG BAO GIỜ đảm bảo đăng câu hỏi trên trang Hỏi & Đáp. Tiêu đề gây hiểu lầm và chữ Q gây lãng phí thời gian cho tất cả những ai đọc nó.
Chris

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

1
@skaffman: (c) nên là "thử nó và xem", và chỉ sau đó (d) hỏi trên SO.
Mac

2
Câu hỏi này có vẻ lạc đề vì nó nói về điều mà bất kỳ ai cũng có thể tìm thấy trong bài kiểm tra AND thủ công trong vòng chưa đầy một phút.
Jasper

Câu trả lời:


168

Tất cả chúng .

Trả về : Bản sao của chuỗi này với khoảng trắng đầu và cuối đã bị xóa hoặc chuỗi này nếu nó không có khoảng trắng đầu hoặc cuối.

~ Trích dẫn từ tài liệu Java 1.5.0

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


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

7
@ user2864740: Câu trả lời này không nhằm mục đích phân tích toàn diện trim, isWhiteSpacev.v. hoặc thảo luận về những điểm mơ hồ trong tài liệu Java; đó là một câu trả lời đơn giản cho câu hỏi cụ thể được hỏi ở trên - tức là, trimphương thức có loại bỏ một khoảng trắng hay nhiều khoảng trắng?
LukeH

Tôi biết nó không phải. Tôi đã bỏ phiếu vì nó không chỉ ra như vậy, ngay cả khi đậu. 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 ở mức tối thiểu).
user2864740

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 ký tự whilemà bạn có thể thấy có nghĩa là tất cả các ký tự có unicode bên dưới ký tự khoảng trắng, ở đầu và cuối, đều bị xóa.


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 : tất nhiên bài kiểm tra (cho JUnit + Hamcrest) không thất bại


43
Hỏi một lập trình viên mới chỉ học được cách để làm một System.out.println để làm một bài kiểm tra đơn vị để xem kết quả là những gì ...
jaxkodex

26

Tuy nhiên, cần phải chỉ ra một điều là String.trim có một đị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 xóa các ký tự điều khiển ASCII mà bạn có thể không coi là khoảng trắng.

Phương pháp này có thể được sử dụng để cắt bỏ khoảng trắng từ đầu và cuối của một chuỗi; trên thực tế, nó cũng cắt 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).


3
Có vẻ như một sự giám sát khủng khiếp đối với phần nhà thiết kế .. và việc làm quá kỹ thuật một cách khủng khiếp đối với tài liệu không giúp được gì nhiều.
user2864740,

2
Hoan hô! Bạn đã đặt câu hỏi đơn giản nhất từng được hỏi trên StackOverflow và tìm thấy điều gì đó thông minh để nói về nó. Bạn là một tín dụng cho cuộc đua.
Mark McKenna

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

15

Xem API cho lớp Chuỗi:

Trả về bản sao của chuỗi, với khoảng trắng đầu và cuối bị bỏ qua.

Khoảng trắng ở cả hai bên bị xóa:

Lưu ý rằng trim()không thay đổi cá thể Chuỗi, 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 Ví dụ String (ngoại trừ một số những thứ dơ bẩn mà có thể sụp đổ VM)
AvrDragon

13

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

Nhưng hãy lưu ý, '\ u00A0' ( Unicode NO-BREAK SPACE &nbsp; ) cũng được coi 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.

Để xóa nó, tôi sử dụng:

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

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


Dựa trên Javadoc, nó loại bỏ khoảng trắng ở đầu và cuối, bao gồm dấu cách, tab, ký tự xuống dòng mới, nguồn cấp dữ liệu biểu mẫu, ... và loại bỏ các ký tự không ở đầu hoặc cuối.
Marquis of Lorne,

Xin cảm ơn, nó giúp tôi phân bổ
Asad Haider

8

Ví dụ về Java trim()loại bỏ khoảng trắng:

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

ĐẦU RA

old = 
 This is a String.


new = This is a String.

4

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

/**
 * 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à chiều dài, nó gọi phương thức chuỗi con của lớp String.


Trong đó "khoảng trắng" là "các ký tự có giá trị nhỏ hơn hoặc bằng \ x20" .. brillant.
user2864740,

3

trim()sẽ loại bỏ tất cả các khoảng trống ở đầu và cuối. Nhưng hãy lưu ý: Chuỗi của bạn không bị thay đổi. trim()sẽ trả về một cá thể chuỗi mới thay thế.


Nó sẽ loại bỏ tất cả các khoảng trắng
Marquis of Lorne,

3

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

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

Có, đầu ra sẽ là, "abc"; Nhưng nếu đầu vào Chuỗi của bạn là:

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

Đầu ra sẽ là This is a test Vì vậy, trim chỉ loại bỏ khoảng trắng trước ký tự đầu tiên và sau ký tự cuối cùng của bạn trong chuỗi và bỏ qua các khoảng trắng bên trong. Đây là một đoạn mã của tôi tối ưu hóa một chút Stringphương pháp trim tích hợp sẵn loại bỏ các khoảng trắng bên trong và xóa các khoảng trắng 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);
  }

Một vài câu lệnh đầu tiên trong câu trả lời này hoàn toàn sai, đầu ra sẽ không phải là "abc". Có lẽ bạn đã quên .trim()trong System.out.println(a);?
Arjan

2

Nó sẽ loại bỏ tất cả các khoảng trống ở cả hai bên.


2

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

nếu a string sSomething = "xxxxx", đại diện xcho khoảng trắng, sSomething.trim()sẽ trả về một chuỗi trống.

nếu a string sSomething = "xxAxx", đại diện xcho khoảng trắng, sSomething.trim()sẽ trả về A.

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

Nếu bạn muốn một chuỗi được đóng gói gọn gàng, hãy kết hợp trim()với regex như được hiển thị trong bài đăng này: Làm thế nào để loại bỏ các khoảng trắng trùng lặp trong chuỗi bằng 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.


2

Để chỉ giữ một phiên bản cho Chuỗi, bạn có thể sử dụng cách sau.

str = "  Hello   ";

hoặc là

str = str.trim();

Khi đó giá trị của strchuỗi, sẽ làstr = "Hello"



0

Javadoc cho Chuỗi có tất cả các chi tiết. Loại bỏ khoảng trắng (khoảng trắng, tab, v.v.) ở 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ẽ thực hiện 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ế để gần với Java nhất có thể. Nói chung, nó được hiểu là Java với một số thư giãn. Một lựa chọn khác thuộc loại này là ngôn ngữ Groovy . Cả hai ngôn ngữ kịch bản này đều cung cấp vòng lặp Đọc-Đánh giá-In thuận tiện biết từ các ngôn ngữ được thông dịch. Vì vậy, bạn có thể chạy bảng điều khiển và chỉ cần nhập:

"     content     ".trim();

Bạn sẽ thấy "content"kết quả sau khi nhấn Enter(hoặc Ctrl+Rtrong bảng điều khiển Groovy).


6
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?
james.garriss

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

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

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

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

@EJP các replaceAll cũng sẽ thay thế khoảng trắng trong chuỗi với một không gian duy nhất, trong khi cắt sẽ chỉ xử lý không gian ở đầu và đuôi
Krishna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.