簡體   English   中英

如何在Java中只刪除字符串的尾隨空格並保留前導空格?

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

trim()函數刪除了尾部和前導空格,但是,如果我只想刪除字符串的尾隨空格,我該怎么辦?

自JDK 11起

如果您使用的是JDK 11或更高版本,則應該使用stripTrailing()


早期的JDK版本

使用正則表達式\\s++$ ,可以用空字符串( "" )替換所有尾隨空格字符(包括空格和制表符)。

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

產量

  foo

在線演示。

這是正則表達式的細分:

  • \\s - 任何空格字符,
  • ++ - 匹配前一個標記中的一個或多個(占有); 即,匹配一個或多個空白字符。 +模式以其所有格形式 ++ ,當模式不匹配時,花費較少的時間來檢測案例。
  • $ - 字符串的結尾。

因此,正則表達式將匹配盡可能多的空格,直接跟隨字符串的結尾:換句話說,尾隨空格。

如果您需要在以后擴展您的要求,那么對學習正則表達式的投入將變得更有價值。

參考

另一種選擇是使用Apache Commons StringUtils ,特別是StringUtils.stripEnd

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

我稍微修改了原始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

最實際的答案是@Micha, Ahmad與你想要的相反, 但這就是我想出的,以防你不想使用不熟悉的工具或看到具體的方法。

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| 

我認為最好的方法是:

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

這不會分配任何臨時對象來完成工作,並且比使用正則表達式更快。 它還刪除了所有空格,而不僅僅是''。

這是一個非常簡短,高效且易於閱讀的版本:

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)如果你想使用更廣泛的空格定義。

JDK11您可以使用stripTrailing

String result = str.stripTrailing();

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

trimTrailingWhitespace

此代碼旨在通過使用描述性名稱(並避免使用正則表達式)盡可能輕松地閱讀。

它確實使用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);
}

String value =“歡迎使用java”;

所以我們可以使用

value = value.trim();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM