タイトル: 先頭と末端の文字の削除
SEOタイトル: Java で文字列の先頭・末端を削除する方法完全ガイド
| この記事の要点 |
|
空白を削除: trim / strip
もっとも一般的な「先頭・末尾の空白削除」は trim() / strip() で行います。Java 11 以降はUnicode 空白(全角スペース U+3000 等)も削除できる strip() を推奨。
String s = " hello world ";
s.trim(); // "hello world" — U+0020 以下のみ削除
s.strip(); // "hello world" — Unicode 空白も削除 (Java 11+)
s.stripLeading(); // "hello world "
s.stripTrailing(); // " hello world"
// 全角スペースを含む例
String z = " 全角空白 "; // 全角スペース U+3000
z.trim(); // " 全角空白 " — 削除されない!
z.strip(); // "全角空白" — 削除される
trim と strip の違い
| メソッド | 導入 | 削除対象 |
|---|---|---|
trim() | Java 1.0 | U+0020 (半角スペース) 以下のコードポイント(\t \n \r 等) |
strip() | Java 11 | Character.isWhitespace(int) が true となるすべて(全角スペース U+3000、Em スペース等を含む) |
stripLeading() | Java 11 | 先頭のみ |
stripTrailing() | Java 11 | 末尾のみ |
先頭・末尾の 1 文字を削除
String s = "(hello)";
// substring で両端 1 文字削除
String r1 = s.substring(1, s.length() - 1); // "hello"
// 先頭 1 文字だけ
s.substring(1); // "hello)"
// 末尾 1 文字だけ
s.substring(0, s.length() - 1); // "(hello"
// 安全に(空文字対策)
String safe = (s != null && s.length() >= 2)
? s.substring(1, s.length() - 1) : "";
正規表現で削除
String s = "***hello***";
// 先頭・末尾 1 文字を削除
s.replaceAll("^.|.$", ""); // "**hello**"
// 先頭の * 連続を削除
s.replaceAll("^\\*+", ""); // "hello***"
// 末尾の * 連続を削除
s.replaceAll("\\*+$", ""); // "***hello"
// 両端の * を削除
s.replaceAll("^\\*+|\\*+$", ""); // "hello"
// 両端の空白(trim 相当)
String t = " abc ";
t.replaceAll("^\\s+|\\s+$", ""); // "abc"
// 改行を含む文字列の先頭・末尾の空白
String multi = "\n abc \n";
multi.replaceAll("^\\s+|\\s+$", ""); // "abc"
StringBuilder で削除
StringBuilder sb = new StringBuilder("hello");
// 末尾 1 文字
sb.deleteCharAt(sb.length() - 1); // "hell"
// 先頭 1 文字
sb.deleteCharAt(0); // "ell"
// 範囲削除
sb = new StringBuilder("hello world");
sb.delete(5, 6); // "helloworld"(インデックス 5 のスペース削除)
// 末尾を切り詰める
sb.setLength(sb.length() - 1); // 末尾 1 文字削除
sb.setLength(3); // 先頭 3 文字だけ残す
commons-lang3 StringUtils.strip()
Apache Commons の StringUtils.strip(str, stripChars) は指定した文字を両端から削除できます。null も安全に扱えます。
import org.apache.commons.lang3.StringUtils;
StringUtils.strip(null); // null
StringUtils.strip(""); // ""
StringUtils.strip(" abc "); // "abc" — 空白
StringUtils.strip("abcXY", "XY"); // "abc"
StringUtils.strip("**abc**", "*"); // "abc"
StringUtils.stripStart("***abc", "*"); // "abc"
StringUtils.stripEnd("abc***", "*"); // "abc"
StringUtils.stripAccents("café"); // "cafe" — アクセント削除
用途別の使い分け
| 削除したいもの | 推奨 |
|---|---|
| 両端の空白(ASCII) | str.trim() |
| 両端の空白(全角含む) | str.strip() (Java 11+) |
| 先頭・末尾の 1 文字 | str.substring(1, str.length() - 1) |
| 先頭・末尾の任意の連続文字 | StringUtils.strip(str, "chars") |
| 改行のみ削除(CRLF 対応) | str.replaceAll("\\r?\\n$", "") |
| BOM 削除 | str.replaceAll("^\\uFEFF", "") |
| 大量に処理する場合 | StringBuilder で都度生成を避ける |
典型的なユースケース
// 1. CSV の各セルの前後空白除去
String[] cells = line.split(",");
for (int i = 0; i < cells.length; i++) cells[i] = cells[i].strip();
// 2. ユーザー入力の正規化
String input = request.getParameter("name");
String name = input == null ? "" : input.strip();
// 3. ダブルクォートで囲まれた文字列の外側を剥がす
String quoted = "\"hello\"";
if (quoted.startsWith("\"") && quoted.endsWith("\"")) {
quoted = quoted.substring(1, quoted.length() - 1);
}
// 4. ファイル読み込みで末尾改行除去
String line = reader.readLine(); // BufferedReader は \n は除去済
String content = Files.readString(path).stripTrailing();
// 5. URL の末尾スラッシュ除去
String url = "https://example.com/api/";
String normalized = url.endsWith("/") ? url.substring(0, url.length() - 1) : url;
FAQ
Q: trim と strip、どちらを使うべき?
A: 全角スペースを扱う日本語環境では strip() 推奨。Java 11+ なら基本 strip()。Java 8 だと trim() しかない。
Q: 元の文字列は変わる?
A: 変わりません。String は不変 (immutable) なので、戻り値を受け取って使う必要があります。
Q: trim() が null を返すことはある?
A: ありません。null に対しては NPE。先に str == null を確認するか、StringUtils.strip() を使う。