Java String.trim()将删除多少个空格?


117

在Java中,我有一个像这样的字符串:

"     content     ".

String.trim()移除这些侧面上的所有空间还是仅移除一侧上的一个空间?


197
对于下注者:您的行为举足轻重。这个问题是详细而又具体的,清楚且简单地编写,至少使某个地方的其他程序员感兴趣。人们可能不知道在哪里可以找到Javadoc或源代码。我们的工作是帮助他们,而不是因为无知而抨击他们。
glmxndr 2010年

14
@subtenante,您是正确的。我什至曾经为人们问过Google的问题辩护。但是,像这样简单的事情应该自己进行测试,并且IMO绝对不要保证在问答站点上发布问题。标题具有误导性,对于所有阅读该徽标的人来说,这是浪费时间。
克里斯

9
@Chris:oneat给了我机会看一下源代码。我学到了很多关于trim()的知识。否则我就没有了。每个人都要为自己的时间负责。不能怪奥奈特我们不能从他看似幼稚的问题中获利。
glmxndr

1
@skaffman:(c)应该是“尝试一下然后看”,然后才(d)询问。
Mac

2
这个问题似乎不合时宜,因为它涉及到任何人都可以在手册中找到并在一分钟内进行测试的问题。
贾斯珀2014年

Answers:


168

所有的

返回:除去前导和尾随空格的此字符串的副本;如果没有前导或尾随空格,则返回此字符串的副本。

〜引用自Java 1.5.0文档

(但是为什么不尝试一下并自己看看呢?)


1
我不得不投下反对票,因为这个答案没有涵盖文档“空白”的含义。这似乎是合乎逻辑的,这将是这里Chararacter.isWhitespace是真实的,但是这并不意味着什么用“空格” ..
user2864740

7
@ user2864740:此答案并非旨在对trimisWhiteSpace等等进行全面分析,也不打算讨论Java文档中的歧义;这是对上述特定问题的简单回答-即,该trim方法是删除单个空格还是多个空格?
LukeH

我知道不是。我拒绝投票,因为即使通过也未能指出这一点。无论如何,除非进行了更新(无论如何是最少的),我都无法撤消我的投票。
user2864740

33

从源代码(反编译):

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

while您可以看到的两个表示所有unicode在开头和结尾都在空格字符以下的字符。


27

如有疑问,请编写单元测试:

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

注意:测试(对于JUnit + Hamcrest)当然不会失败


43
问一个刚刚学会如何做System.out.println的新程序员来做单元测试,看看结果是什么...
jaxkodex

26

需要指出的是,String.trim具有“空白”的特殊定义。它不会删除Unicode空格,但也会删除您可能不考虑空格的ASCII控制字符。

该方法可用于从字符串的开头和结尾修剪空格;实际上,它也会修剪所有ASCII控制字符。

如果可能,您可能要使用Commons Lang的StringUtils.strip(),它也处理Unicode空格(也是null安全的)。


3
似乎在设计师方面是一个可怕的疏忽..而文档的过度技术性工作也无济于事。
user2864740

2
太棒了!您回答了StackOverflow上曾经问过的最简单的问题,并发现了一些明智的说法。您是这场比赛的功劳。
马克·麦肯纳

3
@MarkMcKenna:我一直发现,这些所谓的超简单编程问题(修剪字符串,查找文件扩展名等)总是隐藏着复杂性。这对我们的工艺和工具有些幻灭。
Thilo 2014年

15

请参阅String类的API

返回字符串的副本,省略前导和尾随空格。

两侧的空格均已删除:

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

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

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

1
实际上没有什么可以改变String实例(除了一些可能使VM崩溃的脏东西之外)
AvrDragon

13

基于此处的Java文档,.trim()替换项通常替换为'\ u0020'。

但是请注意,'\ u00A0'(Unicode NO-BREAK SPACE &nbsp;)也被视为空格,.trim()不会删除它。这在HTML中尤其常见。

要删除它,我使用:

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

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


基于Javadoc,它删除了前导和尾随空格,其中包括空格,制表符,换行符回车,换页,...,并且排除了不在前导或尾随的字符。
2014年

谢谢,这有助于我分配
Asad Haider

8

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

输出值

old = 
 This is a String.


new = This is a String.

4

从java docs(字符串类源),

/**
 * 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类的substring方法。


其中“空白”是“值小于或等于\ x20的字符” ..明亮。
user2864740

3

trim()将删除所有前导和尾随空格。但请注意:您的字符串未更改。trim()将返回一个新的字符串实例。


它将删除所有前导和尾随空格。
罗恩侯爵

3

如果您的字符串输入是:

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

是的,输出将为“ abc”;但是,如果您的字符串输入是:

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

输出为,This is a test 因此trim仅删除字符串中第一个字符之前和最后一个字符之后的空格,并忽略内部空格。这是我的一段代码,略微优化了内置的Stringtrim方法,以删除内部空格,并删除字符串中第一个和最后一个字符之前和之后的空格。希望能帮助到你。

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

此答案中的前几个陈述是完全错误的,输出将不会是“ abc”。也许您忘记.trim()System.out.println(a);
Arjan


2

一个非常重要的事情是,完全由“空白”组成的字符串将返回一个空字符串。

如果string sSomething = "xxxxx",在x代表空格,sSomething.trim()将返回一个空字符串。

如果string sSomething = "xxAxx",在x代表空格,sSomething.trim()将返回A

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

如果您希望将整齐的打包字符串trim()与regex 结合使用,如本文所示:如何使用Java删除字符串中的重复空格?

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


2

要仅为String保留一个实例,可以使用以下内容。

str = "  Hello   ";

要么

str = str.trim();

然后str字符串的值将是str = "Hello"



0

Javadoc for String具有所有详细信息。从两端删除空格(空格,制表符等)并返回新字符串。


0

如果要检查将执行某些方法的方法,可以使用BeanShell。它是一种脚本语言,旨在与Java尽可能接近。一般而言,它是对Java的一些轻松的解释。这种类型的另一种选择是Groovy语言。这两种脚本语言都提供了方便的Read-Eval-Print循环(从解释语言中了解)。因此,您可以运行控制台,只需键入:

"     content     ".trim();

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


6
因此,要理解Java中的方法,他应该去学习一种全新的语言。真?
james.garriss

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

这与问题无关。
Mark McKenna 2014年

2
@Mark,但偶然地,这是我打开这个问题时要寻找的东西
Armfoot

这也没有意义。如果还有什么要做的事,trim()已经已经repkaceAll()做了。
2014年

@EJP replaceAll还将用单个空格替换字符串中的空格,而trim只处理开头和结尾的空格
克里希纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.