How to remove only trailing spaces of a string in Java and keep leading spaces?

别说谁变了你拦得住时间么 提交于 2019-11-27 03:49:37

Since JDK 11

If you are on JDK 11 or higher you should probably be using stripTrailing().


Earlier JDK versions

Using the regular expression \s++$, you can replace all trailing space characters (includes space and tab characters) with the empty string ("").

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

Output

  foo

Online demo.

Here's a breakdown of the regex:

  • \s – any whitespace character,
  • ++ – match one or more of the previous token (possessively); i.e., match one or more whitespace character. The + pattern is used in its possessive form ++, which takes less time to detect the case when the pattern does not match.
  • $ – the end of the string.

Thus, the regular expression will match as much whitespace as it can that is followed directly by the end of the string: in other words, the trailing whitespace.

The investment into learning regular expressions will become more valuable, if you need to extend your requirements later on.

References

Another option is to use Apache Commons StringUtils, specifically StringUtils.stripEnd

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

I modified the original java.lang.String.trim() method a bit and it should work:

  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 test = new Test();
  String sample = "            Hello World               "; // A String with trailing and leading spaces
  System.out.println(test.trim(sample) + " // No trailing spaces left");

Output:

        Hello World // No trailing spaces left

The most practical answer is @Micha's, Ahmad's is reverse of what you wanted so but here's what I came up with in case you'd prefer not to use unfamiliar tools or to see a concrete approach.

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

Used like:

public static void main( String[] args ) {

    String s = "    Some text here   ";
    System.out.println( s + "|" );
    s = trimEnd( s );
    System.out.println( s + "|" );
}

Output:

Some text here   |
Some text here|

The best way in my opinion:

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

This does not allocate any temporary object to do the job and is faster than using a regular expression. Also it removes all whitespaces, not just ' '.

Here's a very short, efficient and easy-to-read version:

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

As an alternative to str.charAt(i) != ' ' you can also use !Character.isWhitespace(str.charAt(i) if you want to use a broader definition of whitespace.

As of JDK11 you can use stripTrailing:

String result = str.stripTrailing();

Spring framework gives a useful org.springframework.util.StringUtils.

trimTrailingWhitespace

This code is intended to be read a easily as possible by using descriptive names (and avoiding regular expressions).

It does use Java 8's Optional so is not appropriate for everyone.

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

String value= "Welcome to java ";

So we can use

value = value.trim();

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!