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

bra*_*ess 146 java string whitespace

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

aio*_*obe 375

像这样:

yourString = yourString.replaceAll("\\s+", " ");
Run Code Online (Sandbox Code Playgroud)

例如

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));
Run Code Online (Sandbox Code Playgroud)

输出

lorem ipsum dolor sit.
Run Code Online (Sandbox Code Playgroud)

这是什么\s+意思?

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


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

  • @SuhrobSamiev - 自JDK 1.4以来,String.replaceAll()一直在Java中.http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String,java.lang.String) (3认同)
  • 我希望我能为\ s +的精彩解释添加超过+1. (3认同)
  • 字符串文字""\\"`表示由单个反斜杠组成的字符串.所以要表示`\ s +`你写'"\\ s +"`. (2认同)

cod*_*ict 23

你可以使用正则表达式

(\s)\1
Run Code Online (Sandbox Code Playgroud)

用它替换它$1.

Java代码:

str = str.replaceAll("(\\s)\\1","$1");
Run Code Online (Sandbox Code Playgroud)

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

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

str = str.replaceAll("\\s+"," ");
Run Code Online (Sandbox Code Playgroud)

但是如果你想用一个空格替换两个连续的空格,你应该这样做:

str = str.replaceAll("\\s{2}"," ");
Run Code Online (Sandbox Code Playgroud)


Sac*_*hag 9

试试这个 - 你必须这样做 import java.util.regex.*;

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

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


wut*_*aer 9

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

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");
Run Code Online (Sandbox Code Playgroud)

这在Android上与正则表达式相反的速度非常快


ole*_*nik 8

String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
Run Code Online (Sandbox Code Playgroud)


arn*_*bpl 6

虽然为时已晚,但我找到了一个更好的解决方案(对我有用),它将用一个类型的白色空间替换所有连续相同类型的空白区域.那是:

   Hello!\n\n\nMy    World  
Run Code Online (Sandbox Code Playgroud)

将会

 Hello!\nMy World 
Run Code Online (Sandbox Code Playgroud)

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

str = str.trim().replaceAll("(\\s)+", "$1"));
Run Code Online (Sandbox Code Playgroud)

在这里,trim()用""替换所有前导和尾随空白字符串.(\\s)用于\\s组#1中捕获(即"','\n','\ t''等空白区域).+sign用于匹配1个或多个前面的标记.因此,(\\s)+可以是任何单个空白字符('','\n'或'\ t')中的连续字符(1个或更多).$1用于将匹配类型的组#1字符串(仅包含1个空格字符)替换匹配的字符串(即匹配的单个空格字符).上述解决方案将改变如下:

   Hello!\n\n\nMy    World  
Run Code Online (Sandbox Code Playgroud)

将会

Hello!\nMy World
Run Code Online (Sandbox Code Playgroud)

我没有在这里找到我的上述解决方案,所以我发布了它.