【问题标题】:Java how to replace 2 or more spaces with single space in string and delete leading and trailing spacesJava如何用字符串中的单个空格替换2个或多个空格并删除前导和尾随空格
【发布时间】:2011-02-25 07:40:07
【问题描述】:

在 Java 中寻找快速、简单的方法来更改此字符串

" hello     there   "

看起来像这样的东西

"hello there"

我用一个空格替换所有这些多个空格,除了我还希望字符串开头的一个或多个空格消失。

这样的事情让我部分地在那里

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

但不完全是。

【问题讨论】:

  • 您应该考虑接受答案。它使稍后到达该页面的人更容易选择确定的解决方案。
  • 这是最推荐的方式之一。 => 。字符串名称WithProperSpacing = StringUtils.normalizeSpace(stringWithLotOfSpaces);
  • s = s.replaceAll("\\s+"," ");

标签: java regex string replace


【解决方案1】:

试试这个:

String after = before.trim().replaceAll(" +", " ");

另见


没有trim()正则表达式

也可以只用一个replaceAll 来做到这一点,但这比trim() 解决方案的可读性要差得多。尽管如此,这里提供它只是为了展示正则表达式可以做什么:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

有 3 个备选:

  • ^_+ :字符串开头的任何空格序列
    • 匹配和替换为$1,捕获空字符串
  • _+$ :字符串末尾的任意空格序列
    • 匹配和替换为$1,捕获空字符串
  • (_)+ :任何与上述都不匹配的空格序列,这意味着它在中间
    • 匹配和替换为$1,它捕获一个空格

另见

【讨论】:

  • +1,特别是值得注意的是,执行trim() 然后replaceAll() 使用的内存比其他方式少。不是很多,但如果它被多次调用,它可能会加起来,特别是如果有很多“可修剪的空白”。 (Trim() 并没有真正摆脱多余的空间——它只是通过移动开始和结束值来隐藏它。底层的char[] 保持不变。)
  • 这只是一个细节,但我认为( ) +( ){2,} 应该(非常)更有效;)
  • 不错的正则表达式。注意:将空格 ` ` 替换为 \\s 会将任何一组空格替换为所需的字符。
  • 请注意, ( )+ 部分将匹配单个空格并将其替换为单个空格。也许 (+) 会更好,因此它仅在有多个空格时才匹配,并且替换将对字符串进行净更改。
  • 正如 Lee Meador 提到的,.trim().replaceAll(" +", " ")(有两个空格)比.trim().replaceAll(" +", " ")(有一个空格)快。我对只有单个空格和所有双空格的字符串进行了计时测试,在执行 lot 操作(数百万或更多,具体取决于环境)时,两者的速度都大大加快。
【解决方案2】:

你只需要一个:

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

匹配一个或多个空格并用一个空格替换它们,然后在开头和结尾修剪空格(实际上,您可以通过首先修剪然后匹配来反转,以使正则表达式更快,正如有人指出的那样)。

要快速测试一下,请尝试:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

它会返回:

"hello there"

【讨论】:

    【解决方案3】:

    使用 Apache commons StringUtils.normalizeSpace(String str) 方法。见docs here

    【讨论】:

      【解决方案4】:

      这对我来说非常有效:sValue = sValue.trim().replaceAll("\\s+", " ");

      【讨论】:

        【解决方案5】:

        以下代码将压缩单词之间的任何空格并删除字符串开头和结尾的任何空格

        String input = "\n\n\n  a     string with     many    spaces,    \n"+
                       " a \t tab and a newline\n\n";
        String output = input.trim().replaceAll("\\s+", " ");
        System.out.println(output);
        

        这将输出a string with many spaces, a tab and a newline

        请注意,任何不可打印的字符,包括空格、制表符和换行符都将被压缩或删除


        有关更多信息,请参阅相应的文档:

        【讨论】:

          【解决方案6】:
          "[ ]{2,}"
          

          这将匹配多个空格。

          String mytext = " hello     there   ";
          //without trim -> " hello there"
          //with trim -> "hello there"
          mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
          System.out.println(mytext);
          

          输出:

          hello there
          

          【讨论】:

            【解决方案7】:

            trim() 方法删除前导和尾随空格,并使用 replaceAll("regex", "string to replace") 方法和正则表达式 "\s+" 匹配多个空格并将其替换为单个空格

            myText = myText.trim().replaceAll("\\s+"," ");
            

            【讨论】:

              【解决方案8】:

              要消除字符串开头和结尾的空格,请使用String#trim() 方法。然后使用你的mytext.replaceAll("( )+", " ")

              【讨论】:

                【解决方案9】:

                您可以先使用String.trim(),然后对结果应用正则表达式替换命令。

                【讨论】:

                  【解决方案10】:

                  试试这个。

                  示例代码

                  String str = " hello     there   ";
                  System.out.println(str.replaceAll("( +)"," ").trim());
                  

                  输出

                  hello there
                  

                  首先它将用单个空格替换所有空格。比我们应该做的修剪String 因为String 的开始和String 的结束如果StringString 的开始和结束处有空格,它将用单个空格替换所有空格String 所以我们需要修剪它们。比你得到你想要的String

                  【讨论】:

                    【解决方案11】:
                    String blogName = "how to   do    in  java   .         com"; 
                     
                    String nameWithProperSpacing = blogName.replaceAll("\\\s+", " ");
                    

                    【讨论】:

                      【解决方案12】:

                      修剪()

                      仅删除前导和尾随空格。

                      来自 Java 文档, "返回一个值为该字符串的字符串,去掉所有前导和尾随空格。"

                      System.out.println(" D ev  Dum my ".trim());
                      

                      “D ev Dum my”

                      替换(),替换所有()

                      替换单词中的所有空字符串,

                      System.out.println(" D ev  Dum my ".replace(" ",""));
                      
                      System.out.println(" D ev  Dum my ".replaceAll(" ",""));
                      
                      System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));
                      

                      输出:

                      "DevDummy"
                      
                      "DevDummy"
                      
                      "DevDummy"
                      

                      注意:“\s+”是类似于空格字符的正则表达式。

                      参考:https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html

                      【讨论】:

                        【解决方案13】:

                        到目前为止,提供了很多正确的答案,我看到了很多赞成票。但是,上述方法将起作用,但并未真正优化或真正不可读。 我最近遇到了每个开发人员都会喜欢的解决方案。

                        String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );
                        

                        你已经完成了。 这是可读的解决方案。

                        【讨论】:

                          【解决方案14】:

                          在 Kotlin 中它看起来像这样

                          val input = "\n\n\n  a     string with     many    spaces,    \n"
                          val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")
                          

                          【讨论】:

                            【解决方案15】:

                            您也可以使用环视。

                            test.replaceAll("^ +| +$|(?<= ) ", "");
                            

                            test.replaceAll("^ +| +$| (?= )", "")
                            

                            &lt;space&gt;(?= ) 匹配一个空格字符,后跟另一个空格字符。因此,在连续的空格中,它将匹配除最后一个之外的所有空格,因为它后面没有空格字符。这会在删除操作后为您留下一个用于连续空格的空格。

                            示例:

                                String[] tests = {
                                        "  x  ",          // [x]
                                        "  1   2   3  ",  // [1 2 3]
                                        "",               // []
                                        "   ",            // []
                                    };
                                    for (String test : tests) {
                                        System.out.format("[%s]%n",
                                            test.replaceAll("^ +| +$| (?= )", "")
                                        );
                                    }
                            

                            【讨论】:

                              【解决方案16】:
                              String str = " hello world"
                              

                              先减少空格

                              str = str.trim().replaceAll(" +", " ");
                              

                              首字母大写,其他字母小写

                              str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();
                              

                              【讨论】:

                                【解决方案17】:

                                你应该这样做

                                String mytext = " hello     there   ";
                                mytext = mytext.replaceAll("( +)", " ");
                                

                                将 + 放在圆括号内。

                                【讨论】:

                                  【解决方案18】:
                                  String str = "  this is string   ";
                                  str = str.replaceAll("\\s+", " ").trim();
                                  

                                  【讨论】:

                                    【解决方案19】:

                                    String.replaceAll

                                    使用正则表达式 "\s" 并替换为 " "

                                    然后使用String.trim

                                    【讨论】:

                                      【解决方案20】:

                                      这对我有用

                                      scan= filter(scan, " [\\s]+", " ");
                                      scan= sac.trim();
                                      

                                      其中过滤器是跟随函数,扫描是输入字符串:

                                      public String filter(String scan, String regex, String replace) {
                                          StringBuffer sb = new StringBuffer();
                                      
                                          Pattern pt = Pattern.compile(regex);
                                          Matcher m = pt.matcher(scan);
                                      
                                          while (m.find()) {
                                              m.appendReplacement(sb, replace);
                                          }
                                      
                                          m.appendTail(sb);
                                      
                                          return sb.toString();
                                      }
                                      

                                      【讨论】:

                                        【解决方案21】:

                                        删除字符串中任意位置空格的最简单方法。

                                         public String removeWhiteSpaces(String returnString){
                                            returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
                                            return returnString;
                                        }
                                        

                                        【讨论】:

                                          【解决方案22】:

                                          检查一下...

                                          public static void main(String[] args) {
                                              String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
                                              System.out.println("Current      : "+s);
                                              System.out.println("Single Space : "+singleSpace(s));
                                              System.out.println("Space  count : "+spaceCount(s));
                                              System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));
                                          
                                              // Example where it uses the most.
                                              String s = "My name is yashwanth . M";
                                              String s2 = "My nameis yashwanth.M";
                                          
                                              System.out.println("Normal  : "+s.equals(s2));
                                              System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));
                                          
                                          } 
                                          

                                          如果 String 只包含单个空格,则 replace() 不会替换,

                                          如果空格多于一个,则执行 replace() 操作并删除空格。

                                          public static String singleSpace(String str){
                                              return str.replaceAll("  +|   +|\t|\r|\n","");
                                          }
                                          

                                          统计字符串中的空格数。

                                          public static String spaceCount(String str){
                                              int i = 0;
                                              while(str.indexOf(" ") > -1){
                                                //str = str.replaceFirst(" ", ""+(i++));
                                                  str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
                                              }
                                              return str;
                                          }
                                          

                                          Pattern.quote("?") 返回文字模式字符串。

                                          【讨论】:

                                            【解决方案23】:

                                            在我找到第二个答案之前我的方法是使用正则表达式作为更好的解决方案。也许有人需要这个代码。

                                            private String replaceMultipleSpacesFromString(String s){
                                                if(s.length() == 0 ) return "";
                                            
                                                int timesSpace = 0;
                                                String res = "";
                                            
                                                for (int i = 0; i < s.length(); i++) {
                                                    char c = s.charAt(i);
                                            
                                                    if(c == ' '){
                                                        timesSpace++;
                                                        if(timesSpace < 2)
                                                            res += c;
                                                    }else{
                                                        res += c;
                                                        timesSpace = 0;
                                                    }
                                                }
                                            
                                                return res.trim();
                                            }
                                            

                                            【讨论】:

                                              【解决方案24】:

                                              流版本,过滤空格和制表符。

                                              Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))
                                              

                                              【讨论】:

                                                【解决方案25】:
                                                String myText = "   Hello     World   ";
                                                myText = myText.trim().replace(/ +(?= )/g,'');
                                                
                                                
                                                // Output: "Hello World"
                                                

                                                【讨论】:

                                                  【解决方案26】:

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

                                                  【讨论】:

                                                    【解决方案27】:

                                                    如果您已经在项目中使用 Guava (v. 19+),您可能想要使用这个:

                                                    CharMatcher.whitespace().trimAndCollapseFrom(input, ' ');
                                                    

                                                    或者,如果您需要完全删除空格符号( U+0020,请参阅 more whitespaces),请使用:

                                                    CharMatcher.anyOf(" ").trimAndCollapseFrom(input, ' ');
                                                    

                                                    【讨论】:

                                                      【解决方案28】:
                                                      public class RemoveExtraSpacesEfficient {
                                                      
                                                          public static void main(String[] args) {
                                                      
                                                              String s = "my    name is    mr    space ";
                                                      
                                                              char[] charArray = s.toCharArray();
                                                      
                                                              char prev = s.charAt(0);
                                                      
                                                              for (int i = 0; i < charArray.length; i++) {
                                                                  char cur = charArray[i];
                                                                  if (cur == ' ' && prev == ' ') {
                                                      
                                                                  } else {
                                                                      System.out.print(cur);
                                                                  }
                                                                  prev = cur;
                                                              }
                                                          }
                                                      }
                                                      

                                                      上面的解决方案是不使用任何java函数,复杂度为O(n)的算法。

                                                      【讨论】:

                                                        【解决方案29】:

                                                        请使用以下代码

                                                        package com.myjava.string;
                                                        
                                                        import java.util.StringTokenizer;
                                                        
                                                        public class MyStrRemoveMultSpaces {
                                                        
                                                            public static void main(String a[]){
                                                        
                                                                String str = "String    With Multiple      Spaces";
                                                        
                                                                StringTokenizer st = new StringTokenizer(str, " ");
                                                        
                                                                StringBuffer sb = new StringBuffer();
                                                        
                                                                while(st.hasMoreElements()){
                                                                    sb.append(st.nextElement()).append(" ");
                                                                }
                                                        
                                                                System.out.println(sb.toString().trim());
                                                            }
                                                        }
                                                        

                                                        【讨论】:

                                                          【解决方案30】:

                                                          您好抱歉耽搁了! 这是您正在寻找的最佳和最有效的答案:

                                                          import java.util.regex.Matcher;
                                                          import java.util.regex.Pattern;
                                                          
                                                          public class MyPatternReplace {
                                                          
                                                          public String replaceWithPattern(String str,String replace){
                                                          
                                                              Pattern ptn = Pattern.compile("\\s+");
                                                              Matcher mtch = ptn.matcher(str);
                                                              return mtch.replaceAll(replace);
                                                          }
                                                          
                                                          public static void main(String a[]){
                                                              String str = "My    name    is  kingkon.  ";
                                                              MyPatternReplace mpr = new MyPatternReplace();
                                                              System.out.println(mpr.replaceWithPattern(str, " "));
                                                          }
                                                          

                                                          因此,此示例的输出将是: 我叫金刚。

                                                          但是,此方法也会删除您的字符串可能包含的“\n”。因此,如果您不想这样做,只需使用以下简单方法:

                                                          while (str.contains("  ")){  //2 spaces
                                                          str = str.replace("  ", " "); //(2 spaces, 1 space) 
                                                          }
                                                          

                                                          如果你也想去掉前导和尾随空格,只需添加:

                                                          str = str.trim();
                                                          

                                                          【讨论】:

                                                            猜你喜欢
                                                            • 1970-01-01
                                                            • 2018-02-12
                                                            • 2014-10-31
                                                            • 2013-06-03
                                                            • 1970-01-01
                                                            • 2011-09-04
                                                            • 1970-01-01
                                                            • 1970-01-01
                                                            • 1970-01-01
                                                            相关资源
                                                            最近更新 更多