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?
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?
Câu trả lời:
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?)
Chararacter.isWhitespace
là đúng, nhưng đó là không có ý nghĩa gì bởi "khoảng trắng" ..
trim
, isWhiteSpace
v.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à, trim
phương thức có loại bỏ một khoảng trắng hay nhiều khoảng trắng?
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ự while
mà 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.
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
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).
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"
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
) 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 .
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.
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>'\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>'\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>'\u0020'</code>, and let
* <i>m</i> be the index of the last character in the string whose code
* is greater than <code>'\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>, <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.
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ế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 String
phươ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);
}
.trim()
trong System.out.println(a);
?
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 x
cho khoảng trắng, sSomething.trim()
sẽ trả về một chuỗi trống.
nếu a string sSomething = "xxAxx"
, đại diện x
cho 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 x
từ 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.
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.
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+R
trong bảng điều khiển Groovy).
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");
trim()
đã làm những gì repkaceAll()
sẽ làm, nếu còn bất cứ điều gì để làm.