如何使用Java删除字符串中的重复空格?


147

如何使用Java删除字符串中重复的空格(包括制表符,换行符,空格等)?

Answers:


378

像这样:

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

例如

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

输出

lorem ipsum dolor sit.

\s+是什么意思

\s+是一个正则表达式。\s匹配空格,制表符,换行符,回车符,换页或垂直制表符,并+说“其中的一个或多个”。因此,以上代码将用一个空格字符折叠所有长于一个字符的“空白子字符串”。


来源:Java:删除字符串中重复的空白


3
@SuhrobSamiev-从JDK 1.4开始,String.replaceAll()就已经在Java中使用了。docs.oracle.com/javase/1.4.2/docs/api/java/lang/...,java.lang.String中)
戴维·莫尔斯

3
我希望我可以为s +的精彩解释添加+1以上的内容。
Cyntech

我了解,\s+但是2反斜杠\\是什么意思?
saplingPro 2012年

2
字符串文字"\\"表示由单个反斜杠组成的字符串。所以代表\s+你写"\\s+"
aioobe 2012年

1
这将使回车退回吗?还是我必须单独删除“ \\ r”?谢谢!
user3388884 2014年

24

您可以使用正则表达式

(\s)\1

替换为$1

Java代码:

str = str.replaceAll("(\\s)\\1","$1");

如果输入的是"foo\t\tbar "你会得到"foo\tbar "作为输出
,但如果输入的是"foo\t bar"它会保持不变,因为它没有任何连续的空格字符。

如果将所有空白字符(空格,垂直制表符,水平制表符,回车符,换页符,换行符)都视为空格,则可以使用以下正则表达式将任意数量的连续空格替换为一个空格:

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

但是,如果要用单个空格替换两个连续的空格,则应该执行以下操作:

str = str.replaceAll("\\s{2}"," ");

9

试试这个-您必须 import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

string您需要在哪里删除重复的空格的字符串


9

嗨,我发现最快(但不是最漂亮的方式)是

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

与正则表达式相反,这在android上运行非常快


1
仅适用于空格,不适用于制表符和换行符等其他空格。

1
我知道,您必须为其他实体添加更多的while循环。但是,由于这些正则表达式,此代码在android上的运行速度要快得多,我必须处理完整的电子书。
wutzebaer

在台式机上也要快得多。还没有测试过大字符串,但是如果您打算在很多小字符串上运行它,这就是您想要的答案。
Ivelate '18

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

尽管为时已晚,但我发现了一个更好的解决方案(对我有用),该解决方案将所有连续的相同类型的空白替换为该类型的一个空白。那是:

   Hello!\n\n\nMy    World  

将会

 Hello!\nMy World 

请注意,仍然存在前导和尾随空格。所以我完整的解决方案是:

str = str.trim().replaceAll("(\\s)+", "$1"));

在此,trim()将所有前导和尾随空格字符串替换为“”。(\\s)用于\\s组#1中捕获(例如'','\ n','\ t'等空白)。+符号用于匹配1个或多个前面的令牌。所以(\\s)+可以是任何单一的空白字符中的连续字符(1或更大)(””,‘\ n’或‘\ T’)。$1用于用匹配类型(即已匹配的单个空格字符)的组#1字符串(仅包含1个空格字符)替换匹配的字符串。上面的解决方案将像这样更改:

   Hello!\n\n\nMy    World  

将会

Hello!\nMy World

我在这里找不到上述解决方案,因此已将其发布。


0

如果要摆脱所有前导和尾随的多余空格,则需要执行以下操作:

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

然后,您可以使用此处列出的其他策略删除重复项:

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

0

您还可以尝试将String Tokeniser用于任何空格,制表符,换行符以及所有内容。一种简单的方法是

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

这可以通过三个步骤实现:

  1. 将字符串转换为字符数组(ToCharArray)
  2. 在charater数组上申请循环
  3. 然后应用字符串替换功能(替换(“替换您的字符串”,“原始字符串”));

1
那不是一个好的解决方案,将其放入char数组并不能解决任何问题。您实际上并没有在解释如何进行替换,这是问题的核心。另外,请不要发布完全不相关的链接。如果这样做,您将被标记为垃圾邮件发送者。
垫子
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.