【问题标题】:How to remove only trailing spaces of a string in Java and keep leading spaces?如何在Java中仅删除字符串的尾随空格并保留前导空格?
【发布时间】:2013-06-03 04:19:30
【问题描述】:

trim() 函数会同时删除尾随和前导空格,但是,如果我只想删除字符串的尾随空格,我该怎么做呢?

【问题讨论】:

    标签: java android string trim


    【解决方案1】:

    自 JDK 11 起

    如果您使用的是 JDK 11 或更高版本,您可能应该使用 stripTrailing()


    早期的 JDK 版本

    使用正则表达式\s++$,您可以将所有尾随空格字符(包括空格和制表符)替换为空字符串("")。

    final String text = "  foo   ";
    System.out.println(text.replaceFirst("\\s++$", ""));
    

    输出

      foo
    

    Online demo.

    下面是正则表达式的细分:

    • \s – 任何空白字符,
    • ++ – 匹配一个或多个前一个令牌(可能);即,匹配一个或多个空白字符。 + 模式在其possessive form ++ 中使用,当模式不匹配时,它会花费更少的时间来检测大小写。
    • $ – 字符串的结尾。

    因此,正则表达式将尽可能多地匹配紧跟在字符串末尾的空格:换句话说,就是尾随空格。

    如果您以后需要扩展您的需求,学习正则表达式的投资将变得更有价值。

    参考文献

    【讨论】:

    • @WChargin 感谢您提供正则表达式的细分。我认为应该有更多的人跟随您并改进答案。
    【解决方案2】:

    另一种选择是使用 Apache Commons StringUtils,特别是 StringUtils.stripEnd

    String stripped = StringUtils.stripEnd("   my lousy string    "," ");
    

    【讨论】:

    • 对不起,我用的是安卓,所以无法使用
    • 我同意。但是,您应该注意用android 标记您的问题,因为android 不是Java
    • @TimBender 这是我的错,我删除了 android 标签,因为这个问题对我来说似乎是通用的 Java。对不起。
    • Android 可以毫无疑问地使用它。您应该导入 org.apache.commons.lang3 而不是 org.apache.commons.lang。它适用于 API 19+。
    【解决方案3】:

    我稍微修改了原来的java.lang.String.trim() 方法,它应该可以工作:

      public String trim(String str) {
            int len = str.length();
            int st = 0;
    
            char[] val = str.toCharArray();
    
            while ((st < len) && (val[len - 1] <= ' ')) {
                len--;
            }
            return str.substring(st, len);
        }
    

    测试:

      Test test = new Test();
      String sample = "            Hello World               "; // A String with trailing and leading spaces
      System.out.println(test.trim(sample) + " // No trailing spaces left");
    

    输出:

            Hello World // No trailing spaces left
    

    【讨论】:

      【解决方案4】:

      截至JDK11,您可以使用stripTrailing

      String result = str.stripTrailing();
      

      【讨论】:

        【解决方案5】:

        最实用的答案是@Micha's,Ahmad's 与您想要的完全相反,但如果您不想使用不熟悉的工具或查看具体方法,这就是我想出的.

        public String trimEnd( String myString ) {
        
            for ( int i = myString.length() - 1; i >= 0; --i ) {
                if ( myString.charAt(i) == ' ' ) {
                    continue;
                } else {
                    myString = myString.substring( 0, ( i + 1 ) );
                    break;
                }
            }
            return myString;
        }
        

        像这样使用:

        public static void main( String[] args ) {
        
            String s = "    Some text here   ";
            System.out.println( s + "|" );
            s = trimEnd( s );
            System.out.println( s + "|" );
        }
        

        输出:

        Some text here   |
        Some text here|
        

        【讨论】:

        • "不允许使用正则表达式" ...为什么?
        • @WChargin:学生。我们被允许使用 C++、C# 和/或 Java,但没有实用程序或任何让您的生活变得轻松的东西。我将对其进行更新以使其更通用。
        【解决方案6】:

        我认为最好的方法:

        public static String trimEnd(String source) {
            int pos = source.length() - 1;
            while ((pos >= 0) && Character.isWhitespace(source.charAt(pos))) {
                pos--;
            }
            pos++;
            return (pos < source.length()) ? source.substring(0, pos) : source;
        }
        

        这不会分配任何临时对象来完成这项工作,并且比使用正则表达式更快。它还删除了所有空格,而不仅仅是 ' '。

        【讨论】:

          【解决方案7】:

          这是一个非常简短、高效且易于阅读的版本:

          public static String trimTrailing(String str) {
              if (str != null) {
                  for (int i = str.length() - 1; i >= 0; --i) {
                      if (str.charAt(i) != ' ') {
                          return str.substring(0, i + 1);
                      }
                  }
              }
              return str;
          }
          

          如果您想使用更广泛的空白定义,也可以使用 !Character.isWhitespace(str.charAt(i) 来替代 str.charAt(i) != ' '

          【讨论】:

            【解决方案8】:

            Spring 框架提供了一个有用的 org.springframework.util.StringUtils。

            trimTrailingWhitespace

            【讨论】:

              【解决方案9】:

              此代码旨在通过使用描述性名称(并避免使用正则表达式)尽可能容易地阅读。

              它确实使用 Java 8 的 Optional,因此并不适合所有人。

              public static String removeTrailingWhitspace(String string) {
                  while (hasWhitespaceLastCharacter(string)) {
                      string = removeLastCharacter(string);
                  }
                  return string;
              }
              
              private static boolean hasWhitespaceLastCharacter(String string) {
                  return getLastCharacter(string)
                          .map(Character::isWhitespace)
                          .orElse(false);
              }
              
              private static Optional<Character> getLastCharacter(String string) {
                  if (string.isEmpty()) {
                      return Optional.empty();
                  }
                  return Optional.of(string.charAt(string.length() - 1));
              }
              
              private static String removeLastCharacter(String string) {
                  if (string.isEmpty()) {
                      throw new IllegalArgumentException("String must not be empty");
                  }
                  return string.substring(0, string.length() - 1);
              }
              

              【讨论】:

                【解决方案10】:

                String value="欢迎来到java";

                所以我们可以使用

                值 = value.trim();

                【讨论】:

                • OP 要求只删除尾随空格。
                • trim() 返回字符串的副本,省略前导和尾随空格。
                猜你喜欢
                • 2023-03-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-02
                相关资源
                最近更新 更多