在Java中去除字符串中的空格

827

我有一个字符串如下:

mysz = "name=john age=13 year=2001";
我想要移除字符串中的空格。我尝试使用trim(),但它只能移除字符串前后的空格。我还尝试了replaceAll("\\W", ""),但这会把=也一并移除。
我该如何得到一个没有空格的字符串?
mysz2 = "name=johnage=13year=2001"

1
"\W" 意味着所有的非单词字符,请参见 http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html。 - Nishant
91
你对于 "name=johnage=13year=2001" 这个字符串有什么计划?希望你不会去解析它。 - Jonas Elfström
6
@JonasElfström 我想这是为了帮助进行字符串比较。 - Isaac
如果字符串实际上是 = " ",那怎么办?trims()所做的就是清除空字符串,就像我提到的那样吗?@zyamat? - gumuruh
这非常有帮助 ==>> StringUtils.deleteWhitespace(mysz); - Kunal Vohra
显示剩余2条评论
37个回答

1501

st.replaceAll("\\s+","")方法可以去除所有空格和不可见字符(例如制表符,\n)。


st.replaceAll("\\s+","")st.replaceAll("\\s","")产生相同的结果。

第二个正则表达式比第一个快20%,但随着连续空格数量的增加,第一个的性能优于第二个。


如果未直接使用,请将值分配给变量:

st = st.replaceAll("\\s+","")

54
我想指出,如果您想用单个空格(或其他一些字符集)替换所有空格,则这两个正则表达式将产生不同的结果。如果有连续的空格,则使用\s将每个空格字符替换为给定的字符。给定\s+,它将用单个替换字符串替换每组空格。我可以看到很多情况下人们可能会来到这篇文章中,以便用不仅仅是空字符串的东西替换空格,这可能会有所帮助。 - Caitlin
2
但如果字符串开头有空格,它不会将其移除。 - lonesome
@lonesome 使用 .trim() 来实现。 - CQM
13
只需使用apache-commons库中的StringUtils。它有一个名为StringUtils.deleteWhitespace的静态方法,可帮助删除字符串中的空格。 - Crozeta
如果您想在循环中使用此方法,应将Pattern定义为final变量Pattern.compile("\\s"),因为replaceAll会在每次调用时重新编译模式return Pattern.compile(regex).matcher(this).replaceAll(replacement); - Waka Waka
这不会删除NBSP。如果这对您很重要,请参见\p{Z}*。StringUtils也不会。 - cquezel

282
replaceAll("\\s","")

\w = 匹配任何单词字符

\W = 匹配任何非单词字符(包括标点等)

\s = 匹配任何空格字符(包括空格、制表符等)

\S = 匹配任何非空格字符(包括字母、数字,以及标点等)

(编辑:如指出的,如果要使用\s匹配正则表达式引擎,则需要转义反斜杠,结果为\\s。)


119

这个问题最正确的答案是:

String mysz2 = mysz.replaceAll("\\s","");

我只是从其他答案中改编了这段代码。我发表它是因为它不仅完全符合问题要求,而且还演示了结果以新字符串形式返回,原始字符串并未被修改,这一点与某些答案所暗示的不同。

(有经验的Java开发人员可能会说“当然,您实际上无法修改字符串”,但是该问题的目标受众可能并不知道这一点。)


这是否意味着我们可以通过编写例如:S = S.replaceAll("\s", ""); 来覆盖原始字符串,其中首先进行替换,然后S将接收S的字符剥离版本? - Sidharth Ghoshal
@frogeyedpeas 这会覆盖变量S,但它并不会覆盖S所指向的字符串。 - Reinstate Monica

79

处理字符串操作的一种方法是使用Apache Commons提供的StringUtils。

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

你可以在这里找到它。 commons-lang包含更多内容,并得到良好的支持。


commons-lang包含更多内容,并得到良好的支持。


不适用于NBSP字符。 - Codesidian

73

replaceAll("\\s", "") 怎么样?详情请参见这里


65
晚一分钟会有很大的不同! - Dave

53

你应该使用

s.replaceAll("\\s+", "");

代替:

s.replaceAll("\\s", "");

这种方式可以处理每个字符串之间有多个空格的情况。

上面正则表达式中的加号表示“一个或多个\s”,其中\s表示任何空格字符(包括空格、制表符等)。为什么我们需要在这里使用s+呢?


3
我打了一个快速的示例来检查这个问题,因为它听起来很奇怪,发现添加加号是不必要的。用多个空格分隔单词是可以的。原因很可能是replaceAll重复执行,直到模式不再匹配字符串的任何部分。 - nyaray
2
确实。在这种情况下,+ 可能会使它更加友好的CPU,因为连续的空格只需进行一次替换操作,但这是唯一的区别。确实是 All,而不是 + 在字符串中替换非连续的空格。 - nitro2k01
它不会删除这个(u00A0)。 - kfc

52

如果你需要同时删除不间断空格,你可以通过以下方式升级你的代码:

st.replaceAll("[\\s|\\u00A0]+", "");

这个无法处理:" ab c " - Mohd Farid
1
@MohdFarid 已经应用了修复,现在应该没问题了。 - Denis Kulagin
我认为应该使用st.replaceAll("[\s|\u00A0]+", ""); - paramupk

35
如果您更喜欢使用实用类而不是正则表达式,Spring框架的StringUtils中有一个trimAllWhitespace(String)方法。

13
欢迎提出其他想法。这些想法可以帮助到一些人,即使不是所有人。 - james.garriss

26

你已经从Gursel Koca那里得到了正确的答案,但我认为这可能不是你真正想要做的事情。那么解析键值如何?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

输出:
名字 = john
年龄 = 13
年份 = 2001


11

最简单的方法是使用commons-lang3库中的org.apache.commons.lang3.StringUtils类,例如"commons-lang3-3.1.jar"。

在您的输入字符串上使用静态方法"StringUtils.deleteWhitespace(String str)",它将返回一个删除所有空格后的字符串。我尝试了你的例子字符串"name=john age=13 year=2001",并且它确实返回了你想要的字符串 - "name=johnage=13year=2001"。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接