49

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

4

10 回答 10

82

从 JDK 11 开始

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


较早的 JDK 版本

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

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

输出

  foo

在线演示。

这是正则表达式的细分:

  • \s– 任何空白字符,
  • ++– 匹配一个或多个前一个标记(可能);即,匹配一个或多个空白字符。+模式以其所有格形式 使用,当++模式不匹配时,它会花费更少的时间来检测情况。
  • $– 字符串的结尾。

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

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

参考

于 2013-06-07T00:17:23.010 回答
12

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

String stripped = StringUtils.stripEnd("   my lousy string    "," ");
于 2013-06-07T00:51:28.107 回答
11

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
于 2013-06-07T00:41:49.103 回答
5

JDK11可以使用stripTrailing

String result = str.stripTrailing();
于 2018-11-30T23:58:11.077 回答
4

最实用的答案是@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|
于 2013-06-07T00:48:21.690 回答
3

我认为最好的方法:

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;
}

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

于 2014-05-03T20:47:48.067 回答
2

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

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;
}

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

于 2014-06-27T13:49:09.087 回答
0

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

它确实使用 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);
}
于 2017-07-15T08:52:30.380 回答
0

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

修剪尾随空白

于 2016-05-19T06:50:25.633 回答
-2

String value="欢迎来到java";

所以我们可以使用

值 = 值.trim();

于 2015-06-24T09:18:22.817 回答