この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:atom
更新日時:2026-06-11 07:10:02

タイトル: String.trim
SEOタイトル: Java String.trim 完全ガイド(先頭末尾の空白除去 / strip との違い / Unicode 空白対応)

この記事の要点
  • String.trim()文字列の先頭と末尾から空白を取り除いて新しい文字列を返す
  • 「空白」の定義は U+0020 以下の制御文字 — 半角スペース・タブ・改行・キャリッジリターン等
  • 全角スペース(U+3000)は取り除かれない。Java 11 以降は strip() で対応
  • String は不変なので戻り値を必ず受け取る(元の文字列は変わらない)
  • よく使うのは入力フォームのバリデーション前処理CSV / ログのパース

trim とは

String.trim() は、文字列の先頭と末尾にある空白文字を取り除いて新しい文字列を返すメソッドです。文字列の途中にある空白はそのまま残ります。

シグネチャ

修飾子と型メソッド戻り値
public Stringtrim()先頭と末尾の空白を削除した文字列

基本的な使い方

String s = "   Hello World   ";
String t = s.trim();
System.out.println("[" + t + "]");  // [Hello World]
System.out.println(s.length());     // 17(元は不変)
System.out.println(t.length());     // 11

Java の Stringイミュータブル(不変)です。trim() は元の文字列を書き換えず、新しい文字列を返すので、必ず戻り値を変数で受け取る必要があります。

取り除かれる「空白」の定義

JavaDoc によると、trim()' '(半角スペース)以下のコードポイント」を空白として扱います。具体的には次が含まれます。

文字コードポイント説明
スペースU+0020半角スペース
水平タブU+0009\t
改行U+000A\n LF
復帰U+000D\r CR
垂直タブU+000B\v
FF(改ページ)U+000C\f
各種制御文字U+0000 〜 U+001FNUL・BEL 等

つまり改行コード CRLF / LF も含めて取り除けます。一行入力をパースする際に readLine() の戻り値を trim() しておくと安全です。

全角スペースは取り除けない

U+3000(全角スペース)はコードポイントが 0x3000 で U+0020 より大きいため、trim() では取り除かれません。日本語入力ではよくある罠です。

String zen = " ABC ";   // 全角スペース挟みのABC
System.out.println("[" + zen.trim() + "]");
// 出力: [ ABC ]   全角スペースは残る

Java 11 以降は strip() を推奨

Java 11 で導入された String.strip() は Unicode の Character.isWhitespace() 定義に基づいて空白を判定するため、全角スペースも含めて取り除けます。新しいコードでは strip() のほうが安全です。

メソッド導入全角スペース判定基準
trim()JDK 1.0取り除かないU+0020 以下のコードポイント
strip()Java 11取り除くCharacter.isWhitespace
stripLeading()Java 11取り除く先頭のみ
stripTrailing()Java 11取り除く末尾のみ
String s = " Hello ";
System.out.println("[" + s.trim()  + "]");  // [ Hello ]
System.out.println("[" + s.strip() + "]");  // [Hello]

典型的なユースケース

  • 入力フォームの前処理 — 余分なスペース付きで送られてきた値を正規化
  • CSV / TSV のパース — 区切り文字の前後に余白が混ざるケースで利用
  • ログのパース — 改行や行末空白を取り除いて比較
  • プロパティファイルや設定ファイルの読み込み

よくある誤用

  • 戻り値を捨てるstr.trim(); だけでは元の str は変わらない。str = str.trim(); と代入する
  • null 安全でない — null に対して trim() を呼ぶと NPE。Objects.requireNonNullElse やラッパで対策する
  • 全角スペース込みで処理したいstrip() を使うか、str.replaceAll("\\s+$", "") 等の正規表現を使う

null 安全に呼ぶイディオム

// Apache Commons Lang を使うパターン
String t = StringUtils.trim(input);    // input が null でも null を返すだけ

// 自前
String t = (input == null) ? null : input.trim();

// Java 9 以降の Optional
String t = Optional.ofNullable(input).map(String::trim).orElse("");

// 空白だけの文字列を空とみなす
boolean isBlank = (input == null || input.trim().isEmpty());
// Java 11 以降は isBlank() メソッドが使える
boolean isBlank2 = (input == null || input.isBlank());

trim と他メソッドの組み合わせ

実務では trim() 単独ではなく、他のメソッドと連結することが多いです。

// CSV パース時の前処理
String[] cols = line.split(",");
for (int i = 0; i < cols.length; i++) {
    cols[i] = cols[i].trim();   // 各カラムの空白を除去
}

// プロパティ値の正規化(前後空白除去 + 小文字化)
String key = rawKey.trim().toLowerCase();

// 空文字判定(Java 11 前)
if (input != null && !input.trim().isEmpty()) {
    process(input.trim());
}

パフォーマンスの注意

trim()新しい String オブジェクトを生成します。1 万件のループで毎回 trim() を呼んでも、現代の JVM では問題にならない速度ですが、同じ文字列に対して何度も呼ぶのは無駄です。一度結果を変数に格納して使い回しましょう。なお、内容が変わらなかった場合(先頭末尾に空白がない場合)は元の文字列をそのまま返す最適化が入っているため、追加のメモリ確保も発生しません。

FAQ

Q: trim() は何文字目までを「空白」とみなす?
A: コードポイントが 0x0020 以下のすべての文字(半角スペース、タブ、改行、各種制御文字)です。0x0020 より大きいコードポイント(全角スペース U+3000 など)は対象外です。

Q: 内部の空白も削除したい
A: str.replaceAll("\\s+", "") で全空白を削除できます。\\s は Java の正規表現で空白文字全般にマッチします。

Q: 連続する空白を 1 つにまとめたい
A: str.trim().replaceAll("\\s+", " ") のように trim() と組み合わせます。

関連