如何在Java中仅删除字符串的尾部空格并保留前导空格?

51

trim()函数可以同时删除字符串前后的空格,但是如果我只想删除字符串末尾的空格,应该怎么做呢?

10个回答

86

自JDK 11开始

如果你使用的是 JDK 11 或更高版本,建议使用 stripTrailing() 方法。


早期 JDK 版本

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

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

输出

  foo

在线演示。

这是一个正则表达式的拆解:

  • \s – 匹配任何空白字符,
  • ++ – 匹配前一个标记的一个或多个(占有性); 也就是匹配一个或多个空白字符。 + 模式以它的占有形式 ++ 使用,这需要更少的时间来检测模式不匹配的情况。
  • $ – 字符串的结尾。

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

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

参考资料


10
谢谢您提供正则表达式的详细说明。我认为更多人应该效仿您,改善回答。 - Micha Wiedenmann

13

另一种选择是使用Apache Commons StringUtils,具体来说是 StringUtils.stripEnd

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

1
抱歉,我在使用安卓系统,所以无法使用它。 - kzjfr0
2
我同意。但是,你应该注意将你的问题标记为“android”,因为“android”不是“Java”。 - Tim Bender
1
@TimBender 这是我的错,我删除了Android标签,因为这个问题对我来说似乎是通用的Java问题。非常抱歉。 - Micha Wiedenmann
5
毫无疑问,Android可以使用这个。你应该导入org.apache.commons.lang3而不是org.apache.commons.lang。它适用于API 19+。 - Kimi Chiu

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

7

JDK11 开始,您可以使用 stripTrailing 方法:

String result = str.stripTrailing();

4
最实用的回答是@Micha的,但如果您不想使用陌生的工具或者想看到一种具体的方法,这是我想到的方法。
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|

1
不允许使用正则表达式...为什么? - wchargin
2
@WChargin:学生。我们可以使用C ++,C#和/或Java,但不允许使用任何实用程序或使您的生活变得更轻松的东西。我将更新它以使其更通用。 - ChiefTwoPencils

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

这种方法不需要分配任何临时对象来完成任务,比使用正则表达式更快。并且它删除所有的空格,而不仅仅是 ' '。


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)

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

0

-2

字符串值 = "欢迎来到Java";

因此,我们可以使用

值 = 值.trim();


2
OP要求只删除末尾空格。 - Matt
trim()函数返回一个新的字符串,该字符串删除了前导和尾随的空格。 - rumman0786

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接