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

问题描述:

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

像这样:

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

例如

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

输出

lorem ipsum dolor sit. 

是什么\s+是什么意思?

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


来源:Java: Removing duplicate white spaces in strings

+0

为什么没有的replaceAll方法?最新的JDK是否支持这种方法? – 2011-12-20 05:25:53

+2

@SuhSosiev - String.replaceAll()自JDK 1.4以来一直在Java中。 http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String,java.lang.String) – 2011-12-22 19:25:29

+3

我希望我可以添加更多+1对\ s +的真棒解释。 – Cyntech 2012-06-01 12:56:39

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

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

哪里string是你的弦上,你需要删除重复的空格

您可以使用正则表达式

(\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}"," "); 

这三个步骤是可能的:

  1. 将字符串中的字符数组(ToCharArray)
  2. 申请回路系统字符数组
  3. 然后申请字符串替换功能(更换(“蜇你要替换”,“原始字符串”));
+1

这不是一个好的解决方案,掉到char数组并不能解决任何问题。你实际上没有解释如何做替换,这是问题的核心。也请**不要**完全无关的链接。如果你这样做,你会被标记为垃圾邮件发送者。 – Mat 2011-08-21 14:13:09

如果你想摆脱所有的开头和结尾多余的空白,那么你想要做这样的事情:

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

然后你可以使用这里列出的其他策略删除重复的:

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

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

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

这是在相反的正则表达式

+1

仅适用于空格,但不适用于制表符和换行符等其他空格。 – Pang 2013-08-31 06:41:21

+1

我知道,你必须为其他实体添加更多这些while循环。但是,这些代码运行得更快,因为这些正则表达式,我不得不处理完整的电子书。 – wutzebaer 2013-09-02 09:22:15

+0

桌面上的速度也非常快。还没有测试它的大字符串,但如果你打算在很多小字符串上运行它,这是你正在寻找的答案。 – Ivelate 2018-02-19 02:31:02

运行非常快于Android虽然为时已晚,我已经找到了更好的解决方案(即对我的作品),将用一个空格替换所有连续的同类型的空格它的类型。那就是:

Hello!\n\n\nMy World 

Hello!\nMy World 

公告仍有开头和结尾的空格。所以我的完整的解决方案是:

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

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

Hello!\n\n\nMy World 

Hello!\nMy World 

我没有找到我的上述方案在这里,所以我已经发布了。

你也可以尝试使用String Tokeniser,用于任何空格,制表符,换行符和全部。一个简单的方法是,

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

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