Java Tips | 基本ユーティリティ:文字列トリム

Java Java
スポンサーリンク

文字列トリムは「入力をきれいにするフィルター」

業務システムでは、ユーザー入力や外部システムからの文字列に「余計な空白」が混ざるのは日常茶飯事です。
例えば「 山田太郎 」のように前後にスペースが入っていたり、「 \n(改行)」や「\t(タブ)」が紛れ込んでいたりします。

このままデータベースに保存すると、見た目は同じなのに実際は違う文字列になり、検索に引っかからない、重複チェックをすり抜ける、といったバグにつながります。
そこで使うのが「トリム(trim)」、つまり「前後の余計な空白を削る」処理です。

ここでは、Java 標準の trimstrip、そして実務でよく使うユーティリティ的な書き方を、初心者向けにかみ砕いて解説します。


String.trim の基本と「落とし穴」

trim がやっていることをコードでイメージする

String.trim() は、文字列の「先頭」と「末尾」にある空白文字を削除します。
イメージとしては、左から右へ、右から左へ走査して「空白じゃない文字が出てくるまで削る」処理です。

String raw = "   山田太郎\t\n";

String trimmed = raw.trim();

System.out.println("[" + trimmed + "]");  // [山田太郎]
Java

ここで削除されるのは、半角スペース " ", タブ \t, 改行 \n, 復帰 \r など、Unicode の 0x00〜0x20 の制御文字・空白です。
つまり「昔ながらの ASCII ベースの空白」だけが対象になっています。

全角スペースが消えない理由を深掘りする

実務でよくハマるのが「全角スペースが消えない」問題です。

String raw = " 山田太郎 ";  // 全角スペースで囲まれている

String trimmed = raw.trim();

System.out.println("[" + trimmed + "]");  // [ 山田太郎 ] そのまま…
Java

なぜかというと、trim() が削除対象としているのは 0x00〜0x20 の制御文字だけで、全角スペースや一部の Unicode 空白は含まれていないからです。
最近のシステムでは、Excel や外部 Web システムからのデータに「見えない Unicode 空白」が混ざることが多く、trim() だけでは取り切れないケースが頻発します。

ここが業務での重要ポイントで、「trim() をかけたから安心」と思い込むと、入力チェックや必須チェックをすり抜けるバグにつながります。


Java 11 以降の strip 系メソッドを使いこなす

strip と trim の違いを押さえる

Java 11 からは、Stringstrip, stripLeading, stripTrailing というメソッドが追加されました。
これらは「空白の定義」が trim() より新しく、Character.isWhiteSpace() に基づいています。

Character.isWhiteSpace() は Unicode の空白全般を対象にするため、全角スペースなどもきちんと削除できます。

String raw = " 山田太郎 ";  // 全角スペース

String trimmed = raw.trim();
String stripped = raw.strip();

System.out.println("[" + trimmed + "]");   // [ 山田太郎 ]
System.out.println("[" + stripped + "]");  // [山田太郎]
Java

このように、strip() は「現代的な空白定義」で前後の空白を削ってくれるので、Java 11 以上なら基本的に trim() より strip() を優先して使うのが実務的なベストプラクティスです。

stripLeading / stripTrailing で片側だけ削る

stripLeading() は先頭だけ、stripTrailing() は末尾だけの空白を削除します。

String raw = "   山田太郎   ";

// 先頭だけ削る
String left = raw.stripLeading();   // "山田太郎   "

// 末尾だけ削る
String right = raw.stripTrailing(); // "   山田太郎"
Java

例えば「右側の空白は意味があるが、左側の空白だけ消したい」といった特殊な要件にも対応できます。
業務ではそこまで細かく使う場面は多くありませんが、「片側だけ削れる」ということを知っておくと、要件に応じた柔軟な実装ができます。


実務でよく使う「トリム系ユーティリティ」の考え方

null セーフなトリムを自作する

trim()strip() はインスタンスメソッドなので、対象の文字列が null だと NullPointerException になります。
ユーザー入力や外部データを扱うときは null が普通に飛んでくるので、そのたびに if (s != null) と書くのは面倒です。

そこで、プロジェクト共通のユーティリティとして「null セーフなトリム」を用意しておくと便利です。

public final class Strings {

    private Strings() {}

    // Java 11 以上を想定した null セーフ strip
    public static String safeStrip(String s) {
        return s == null ? null : s.strip();
    }

    // null のときは空文字にそろえる版
    public static String stripOrEmpty(String s) {
        return s == null ? "" : s.strip();
    }
}
Java

使う側はこうなります。

String raw = getInput();  // null かもしれない

String normalized = Strings.stripOrEmpty(raw);

if (normalized.isEmpty()) {
    System.out.println("未入力です");
}
Java

毎回 null チェックを書かなくてよくなり、「入力値を正規化する」という意図がコードから読み取りやすくなります。
こういう「小さなユーティリティ」を 1 か所にまとめておくのが、業務コードを安定させるコツです。

「空文字かどうか」のチェックとセットで考える

トリムは単体で使うより、「トリムしてから空かどうかを見る」というセットで使うことが多いです。

String raw = getInput();  // "   " のようなスペースだけの入力もあり得る

String normalized = Strings.stripOrEmpty(raw);

if (normalized.isEmpty()) {
    // 実質的に何も入力されていない
    System.out.println("必須項目です");
}
Java

このように「前後の空白を削ってから空文字判定」をすることで、
「スペースだけ入力して必須チェックをすり抜ける」といった典型的なバグを防げます。


trim では足りないときの実務的テクニック

正規表現で「前後のあらゆる空白」を削る

Java 8 以前や、より細かく制御したい場合は、正規表現で前後の空白を削る方法があります。

String raw = "  山田 太郎 ";  // 全角スペースや特殊空白を含むと仮定

String cleaned = raw.replaceAll("^[\\s\\p{Z}]+|[\\s\\p{Z}]+$", "");

System.out.println("[" + cleaned + "]");  // [山田 太郎]
Java

ここで使っているポイントは次の通りです。

  • \s は制御文字+一般的な空白
  • \p{Z} は Unicode の空白カテゴリ(全角スペースなど)

この組み合わせにより、「前後のあらゆる空白」をほぼ網羅的に削除できます。
ただし、正規表現は初心者には少しとっつきにくいので、「必要になったらこのパターンをコピペして使う」くらいのスタンスでも構いません。

Apache Commons StringUtils を使う選択肢

現場では、Apache Commons Lang の StringUtils を使うプロジェクトも多いです。
StringUtils.trimStringUtils.strip は、null セーフであったり、Unicode 空白に対応していたりと、標準の trim() より実務寄りの挙動をしてくれます。

import org.apache.commons.lang3.StringUtils;

String raw = null;

String trimmed = StringUtils.trim(raw);   // null を返す
String stripped = StringUtils.strip(raw); // null を返す
Java

外部ライブラリを入れられる環境なら、「トリム周りは全部 StringUtils に任せる」という割り切りも十分アリです。
ただし、学習段階ではまず標準の trim / strip の挙動を理解してから使うほうが、ブラックボックスにならずに済みます。


まとめ:初心者が身につけるべきトリムの感覚

1. 「トリムは前後だけ、中身はそのまま」

trim()strip() は、文字列の「先頭」と「末尾」の空白だけを削除し、途中の空白はそのまま残します。
「単語間のスペースまで消える」と勘違いしないことが大事です。

2. 「Java 11 以上なら strip を基本にする」

trim() は古い空白定義に基づいていて、全角スペースなどを削除できません。
Java 11 以上なら、Unicode ベースの strip() を基本に使う、と覚えておくと実務でのトラブルが減ります。

3. 「トリム+空文字チェック」をワンセットで考える

ユーザー入力や外部データでは、「スペースだけの入力」を「未入力」とみなすのが普通です。
そのため、strip()(または trim())してから isEmpty() で判定する、というパターンを体に染み込ませておくと、堅牢な入力チェックが書けます。

ここまで押さえれば、「文字列トリム」はもう怖くありません。

タイトルとURLをコピーしました