web-dev-qa-db-ja.com

Javaの文字列の末尾のスペースのみを削除し、先頭のスペースを保持する方法は?

trim() 関数は、末尾のスペースと先頭のスペースの両方を削除しますが、文字列の末尾のスペースのみを削除したい場合、どうすればよいですか?

38
kzjfr0

JDK 11以降

JDK 11以降を使用している場合は、おそらく stripTrailing() を使用する必要があります。


以前のJDKバージョン

正規表現\s++$を使用すると、末尾のスペース文字(スペースおよびタブ文字を含む)をすべて空の文字列("")に置き換えることができます。

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

出力

  foo

オンラインデモ

正規表現の内訳は次のとおりです。

  • \s –任意の空白文字、
  • ++ – 1つ以上の前のトークンと(場合によっては)一致します。つまり、1つ以上の空白文字に一致します。 +パターンは、 所有形式++で使用されます。これにより、パターンが一致しない場合を検出する時間が短縮されます。
  • $ –文字列の終わり。

したがって、正規表現は、文字列の末尾が直接続く、できるだけ多くの空白、つまり末尾の空白に一致します。

後で要件を拡張する必要がある場合、正規表現の学習への投資はより価値があります。

参考文献

58

別のオプションは、Apache Commons StringUtils、特に StringUtils.stripEnd を使用することです

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

元の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
9
Ahmad

最も実用的な答えは@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|
3
ChiefTwoPencils

私の意見では最善の方法:

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
BladeCoder

これは非常に短く、効率的で読みやすいバージョンです。

_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)を使用することもできます。

2
peterh

JDK11を使用できます stripTrailing

String result = str.stripTrailing();
1
Aomine

このコードは、わかりやすい名前を使用して(および正規表現を避けて)できる限り簡単に読み取ることを目的としています。

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
James Baker

文字列値= "Java"へようこそ;;

だから我々は使用することができます

値= value.trim();

0
Pintu

Springフレームワークは便利なorg.springframework.util.StringUtilsを提供します。

trimTrailingWhitespace

0
Jacky