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

タイトル: 先頭と末端の文字の削除
SEOタイトル: Java で文字列の先頭・末端を削除する方法完全ガイド

この記事の要点
  • 空白だけを削除: String.trim() (ASCII 空白) / String.strip() (Java 11+、Unicode 空白対応)
  • 先頭だけ stripLeading()、末尾だけ stripTrailing()
  • 任意の 1 文字削除: str.substring(1, str.length() - 1)
  • 正規表現: str.replaceAll("^.|.$", "") で先頭・末尾 1 文字、^\s+|\s+$ で空白
  • commons-lang3: StringUtils.strip(str, "削除する文字") で指定文字を両端から削除

空白を削除: 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.0U+0020 (半角スペース) 以下のコードポイント(\t \n \r 等)
strip()Java 11Character.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() を使う。