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

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

【问题讨论】:

    标签: java string whitespace


    【解决方案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("\\s{2}"," ");
    

    【讨论】:

      【解决方案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】:

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

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

                【讨论】:

                • 这不是一个好的解决方案,放入 char 数组并不能解决任何问题。您实际上并没有解释如何进行替换,这是问题的核心。也请不要发布完全不相关的链接。如果这样做,您将被标记为垃圾邮件发送者。
                猜你喜欢
                • 2019-09-10
                • 1970-01-01
                • 2011-12-07
                • 1970-01-01
                • 1970-01-01
                • 2012-08-19
                • 2016-02-21
                • 2023-04-03
                • 1970-01-01
                相关资源
                最近更新 更多