Javaで文字列の前後の空白を削除したいとき、多くの人がまず trim() を使います。しかし、実務で扱うデータはもっと複雑。
実は trim() では 取り除けない空白 が存在します。
この記事では、
-
trim() の弱点
-
完全に空白除去したいときのベストプラクティス
-
実務(CSV・外部連携・Webアプリ)でのよくある落とし穴
をわかりやすく整理します。
■ trim() は万能ではない:取り除けない空白がある
trim() はあくまで Unicodeの制御文字(0x00–0x20) のみを対象にしています。
▼ trim()で削除できる例
-
半角スペース
" " -
タブ
\t -
改行
\n -
復帰
\r
▼ trim()で削除できない代表例
-
全角スペース( )
-
ノーブレークスペース( )
-
ゼロ幅スペース(\u200B)
-
特殊なUnicode空白
外部システム連携やExcel由来データで**“見えないゴミ空白”**が混入し、trim()では除去できないケースは非常に多いです。
■ 前後の空白を「完全に」除去する方法
① 正規表現による空白除去(最も汎用的)
▼ ポイント
-
\s= 制御文字+一般的な空白 -
\p{Z}= Unicodeの空白カテゴリ(全角スペースなど) -
前後どちらも削除できる
trim() では消えない全角・特殊スペースもまとめて除去できます。
■ ② Apache Commons Langの StringUtils を使う方法(簡単)
Apache Commons Lang が使えるなら、こちらが最も便利。
▼ trim()との違い
-
全角スペースも削除できる
-
Unicode空白に幅広く対応
外部システムとの連携が多い業務システムでは定番です。
■ ③ カスタム実装で「ホワイトリスト方式」
どの空白を除去するかを 自分で定義したい場合。
よく問題になる空白だけに絞りたいときに有効です。
■ 比較表:どの方法を使うべき?(実務ベース)
| 方法 | メリット | デメリット | 実務での利用度 |
|---|---|---|---|
| trim() | 標準、軽量、速い | 全角スペースに弱い | △ |
| 正規表現 | 完全除去できる | 少し処理が重い | ◎ |
| Apache StringUtils | 記述が最も簡単 | ライブラリが必要 | ◎ |
| カスタムRegex | 精密に制御可能 | コードの読みにくさ | ○ |
■ 実務で多いトラブル例
● CSVインポート時に項目が一致しない
→ Excel入力データに 全角スペース が混入している
→ trim() では削除されずバリデーションNG
● 外部システムのレスポンス整形で意図せず不一致
→ JSONのフィールドに ノーブレークスペース が入っていた
● Webフォームの入力チェックで正しく弾けない
→ ゼロ幅スペース(\u200B)が悪さをしていた
Javaの文字列処理では 目に見えないUnicode空白 がしばしば問題を起こします。
■ まとめ:trim() だけに頼らないこと!
前後の空白を 100%除去 したいなら、
-
正規表現(\s + \p{Z})
-
StringUtils.trim()
このどちらかが“安全策”です。
業務システム、外部連携、CSV処理など “実データを扱う場面” では trim() だけでは不十分なことが多いため、ぜひ今回の方法を取り入れてみてください。
