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

Posted

技术标签:

【中文标题】如何使用Java删除字符串中的重复空格?【英文标题】:How to remove duplicate white spaces in string using Java? 【发布时间】:2011-04-26 21:57:58 【问题描述】:

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

【问题讨论】:

【参考方案1】:

像这样:

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

【讨论】:

@SuhrobSamiev -- String.replaceAll() 自 JDK 1.4 以来一直在 Java 中。 docs.oracle.com/javase/1.4.2/docs/api/java/lang/…, java.lang.String) 我希望我可以为 \s+ 的精彩解释添加超过 +1 的内容。 我理解 \s+ 但 2 反斜杠 \\ 是什么意思? 字符串文字"\\" 表示由单个反斜杠组成的字符串。所以要代表\s+,你写"\\s+" 这会删除回车吗?还是我必须单独删除“\\r”?谢谢!【参考方案2】:

你可以使用正则表达式

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

【讨论】:

【参考方案3】:
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

【讨论】:

【参考方案4】:

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

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

string 是您需要删除重复空格的字符串

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

仅适用于空格,但不适用于制表符和换行符等其他空格。 我知道,您必须为其他实体添加更多这些 while 循环。但是这段代码在 android 上运行得更快,因为这些正则表达式,我必须处理完整的电子书。 在桌面上也快得多。尚未针对大字符串对其进行测试,但如果您打算在许多小字符串上运行它,这就是您正在寻找的答案。【参考方案6】:

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

   Hello!\n\n\nMy    World  

将会

 Hello!\nMy World 

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

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

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

   Hello!\n\n\nMy    World  

将会

Hello!\nMy World

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

【讨论】:

【参考方案7】:

如果你想摆脱所有前导和尾随无关空格,那么你想做这样的事情:

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

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

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

【讨论】:

【参考方案8】:

您也可以尝试对任何空格、制表符、换行符等使用字符串标记器。一个简单的方法是,

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())

    System.out.print(st.nextToken());

【讨论】:

【参考方案9】:

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

    将字符串转换为字符数组(ToCharArray) 在字符数组上申请循环 然后应用字符串替换函数(Replace("sting you want to replace"," original string"));

【讨论】:

这不是一个好的解决方案,放入 char 数组并不能解决任何问题。您实际上并没有解释如何进行替换,这是问题的核心。也请不要发布完全不相关的链接。如果这样做,您将被标记为垃圾邮件发送者。

以上是关于如何使用Java删除字符串中的重复空格?的主要内容,如果未能解决你的问题,请参考以下文章

如何从PHP和Javascript中的字符串中删除所有空格[重复]

javascript 如何删除字符串中的重复空格?

java如何删除字符串的空格

java - 如何从Java中的String中删除不同数量的空格? [复制]

JAVA中如何去除字符串前后的全角空格(当中保留)?

如何在java中的字符串中填充空格? [复制]