Java String.trim()会删除多less个空格?

在Java中,我有一个像这样的string:

" content ". 

String.trim()删除这些方面的所有空间或每个只有一个空间?

所有这些 。

返回 :删除了前导空白和尾随空白的string的副本,如果没有前导或尾随空白,则为该string。

〜从Java 1.5.0文档引用

(但你为什么不试试看,自己看?)

从源代码(反编译):

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

你可以看到的两个字符意味着unicode低于空格字符的所有字符,在开始和结束时被删除。

如有疑问,请写一个unit testing:

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

NB :当然,testing(对于JUnit + Hamcrest)不会失败

有一点要指出的是,String.trim有一个特殊的“空白”定义。 它不会删除Unicode空格,而且还会删除您不认为空白的ASCII控制字符。

这个方法可以用来修剪string的开始和结尾的空白。 实际上,它也修剪所有的ASCII控制字符。

如果可能的话,你可能需要使用Commons Lang的StringUtils.strip(),它也处理Unicode空白(也是无效的)。

请参阅String类的API :

返回string的副本,省略前导和尾随空白。

两边的空格被删除:

请注意, trim()不会更改String实例,它将返回一个新的对象:

  String original = " content "; String withoutWhitespace = original.trim(); // original still refers to " content " // and withoutWhitespace refers to "content" 

基于这里的Java文档, .trim()取代了通常被称为空白的“\ u0020”。

但是请注意,“\ u00A0”( Unicode NO-BREAK SPACE &nbsp; )也被看作是一个空格,而.trim()不会删除它。 这在HTML中特别常见。

要删除它,我使用:

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

这里讨论了这个问题的一个例子。

Java trim()删除空格的示例:

 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. 

从Java文档(string类源),

 /** * 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; } 

请注意,获取开始和长度后,它会调用String类的子string方法。

trim()将删除所有前导和尾随空白。 但要注意:你的string没有改变。 trim()将会返回一个新的string实例。

如果您的stringinput是:

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

是的,输出将是“abc”; 但是,如果您的stringinput是:

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

输出将是This is a test所以修剪只会删除第一个字符之前和string中的最后一个字符后的空格,并忽略内部空间。 这是我的代码片略微优化内置的String修剪方法删除内部空间,并删除string中的第一个和最后一个字符之前和之后的空格。 希望能帮助到你。

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

它将删除双方的所有空间。

一个非常重要的事情是一个完全由“空格”组成的string将返回一个空string。

如果一个string sSomething = "xxxxx" ,其中x表示空白, sSomething.trim()将返回一个空string。

如果一个string sSomething = "xxAxx" ,其中x表示空白, sSomething.trim()将返回A

如果sSomething ="xxSomethingxxxxAndSomethingxElsexxx"sSomething.trim()将返回SomethingxxxxAndSomethingxElse ,请注意单词之间的x数不会改变。

如果你想要一个整洁的string结合trim()正则expression式在这篇文章中显示: 如何删除string中使用Java重复的空格? 。

顺序对结果没有意义,但trim()首先会更有效率。 希望能帮助到你。

要只保留一个string的实例,可以使用下面的代码。

 str = " Hello "; 

要么

 str = str.trim(); 

那么str的值就是str = "Hello"

修剪()适用于双方。

Javadoc的string有所有的细节。 从两端删除空格(空格,制表符等)并返回一个新的string。

如果你想检查一下什么方法,你可以使用BeanShell 。 这是一种脚本语言,旨在尽可能接近Java。 一般来说,它是一些放松的Java解释。 Groovy语言是这种types的另一种select。 这两种脚本语言都提供了从解释语言中获得的方便的Read-Eval-Print循环。 所以你可以运行控制台,只需键入:

 " content ".trim(); 

Enter (或在Groovy控制台中Ctrl+R )后,您将看到"content"

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