Javaのtrimとstripの違いは、取り除く「空白」の範囲です。trim() は文字コードが U+0020 以下の文字(半角スペース・タブ・改行など)だけを前後から取り除き、strip() は全角スペースを含む Unicode の空白を前後から取り除きます。 全角スペースを消したいなら、Java 11 以降は strip() を選べば用が足ります。

ただし、strip() でも残る文字があります。Web ページからコピーした文字列に混ざりやすい NBSP(ノーブレークスペース)、ゼロ幅スペース、ファイル先頭の BOM です。この記事では、文字ごとに trim・strip・isBlank・Character.isWhitespace がどう動くかを Java 21 で実行して早見表にまとめ、strip で残る文字を消すコード、文字列の途中の空白を消す書き方、Java 8 向けの代替コードまで、コピーして使える形で載せます。

確認環境:Ubuntu 24.04 / OpenJDK 21.0.10(java ファイル名.java で実行)。掲載した実行結果はすべてこの環境の出力です。

trimとstripの早見表

まずは結論の表です。「消える」は前後にその文字を付けた文字列から取り除けたこと、「残る」は取り除けなかったことを表します。

文字(コードポイント) trim() strip() isBlank() Character.isWhitespace
半角スペース(U+0020) 消える 消える true true
タブ(U+0009) 消える 消える true true
改行 LF(U+000A) 消える 消える true true
復帰 CR(U+000D) 消える 消える true true
全角スペース(U+3000) 残る 消える true true
EN スペース(U+2002) 残る 消える true true
行区切り(U+2028) 残る 消える true true
NBSP(U+00A0) 残る 残る false false
狭い NBSP(U+202F) 残る 残る false false
ゼロ幅スペース(U+200B) 残る 残る false false
BOM(U+FEFF) 残る 残る false false
NUL(U+0000) 消える 残る false false

やりたいことから選ぶ場合は、次の表を使ってください。

やりたいこと 書き方 使える版
前後の半角スペース・タブ・改行を消す s.trim() すべての版
前後の全角スペースも消す s.strip() Java 11 以降
先頭だけ消す s.stripLeading() Java 11 以降
末尾だけ消す s.stripTrailing() Java 11 以降
空文字か空白だけかを調べる s.isBlank() Java 11 以降
NBSP・ゼロ幅スペース・BOM も前後から消す 正規表現(この記事の stripAll) すべての版
文字列の途中の空白も消す s.replaceAll("[\\s ]", "") など すべての版
Java 8 で前後の全角スペースを消す 正規表現、または Character.isWhitespace のループ Java 8 でも可

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Javaのtrimとstripの違い|全角スペースを消す方法と早見表」

trimとstripの違いを実行して確かめる

trim() と strip() の違いがいちばんはっきり出るのは全角スペースです。 半角スペースで囲んだ文字列と、全角スペースで囲んだ文字列の両方で試します。コードの中の は全角スペースを表す Java の書き方です(目に見えない文字なので、取り違えを防ぐためにこの形で書いています)。

public class TrimStripDemo {
    public static void main(String[] args) {
        String half = "  注文A  ";
        String full = " 注文A ";
        System.out.println("trim (半角)  : [" + half.trim() + "]");
        System.out.println("strip(半角)  : [" + half.strip() + "]");
        System.out.println("trim (全角)  : [" + full.trim() + "]");
        System.out.println("strip(全角)  : [" + full.strip() + "]");
    }
}

実行結果:

trim (半角)  : [注文A]
strip(半角)  : [注文A]
trim (全角)  : [ 注文A ]
strip(全角)  : [注文A]

半角スペースはどちらでも取り除けますが、全角スペースは trim() では残り、strip() では取り除けます。 結果を [ と ] で囲んで出力しているのは、前後の空白が残っているかを目で見分けるためです。空白を扱うコードを確かめるときに便利な書き方です。

なぜ結果が分かれるのか

2つのメソッドは「空白」の決め方が違います。Oracle の API 仕様(Java SE 21 の String)では、次のように説明されています。

メソッド 取り除く対象(API 仕様の説明)
trim() コードポイントが U+0020(半角スペース)以下の文字
strip() Character.isWhitespace が空白と判定する文字(white space)
isBlank() 空文字、または white space のコードポイントだけなら true

trim() は「文字コードが 0x20 以下かどうか」という数値の比較だけで決めます。全角スペースは U+3000 で 0x20 より大きいので、対象になりません。一方の strip() は Unicode の文字の種類を見るので、全角スペースや EN スペースのような「日本語や各国語の文書で使われる空白」も対象になります。

早見表の最終行にあるとおり、逆のケースもあります。NUL(U+0000)のような制御文字は 0x20 以下なので trim() では取り除かれますが、空白とは判定されないので strip() では残ります。trim は「0x20 以下を落とす」、strip は「Unicode の空白を落とす」 と覚えておくと、どちらの結果も説明がつきます。

文字ごとの結果を一覧にするコード

早見表は次のプログラムの出力から作りました。調べたい文字を1行足せば、自分の環境で同じ表を作れます。

import java.util.LinkedHashMap;
import java.util.Map;

public class WhitespaceTable {
    public static void main(String[] args) {
        Map<String, String> chars = new LinkedHashMap<>();
        chars.put("半角スペース U+0020", " ");
        chars.put("タブ U+0009", "\t");
        chars.put("改行LF U+000A", "\n");
        chars.put("復帰CR U+000D", "\r");
        chars.put("全角スペース U+3000", " ");
        chars.put("NBSP U+00A0", " ");
        chars.put("ゼロ幅スペース U+200B", "​");
        chars.put("BOM U+FEFF", "");
        chars.put("ENスペース U+2002", " ");
        chars.put("狭いNBSP U+202F", " ");
        chars.put("行区切り U+2028", "");
        chars.put("NUL U+0000", "\u0000");
        chars.put("単位区切り U+001F", "\u001F");

        System.out.println("文字 | trim | strip | isBlank | isWhitespace | isSpaceChar");
        for (Map.Entry<String, String> e : chars.entrySet()) {
            String c = e.getValue();
            String s = c + "A" + c;
            boolean trimOk = s.trim().equals("A");
            boolean stripOk = s.strip().equals("A");
            System.out.println(e.getKey()
                + " | " + (trimOk ? "消える" : "残る")
                + " | " + (stripOk ? "消える" : "残る")
                + " | " + c.isBlank()
                + " | " + Character.isWhitespace(c.charAt(0))
                + " | " + Character.isSpaceChar(c.charAt(0)));
        }
    }
}

実行結果:

文字 | trim | strip | isBlank | isWhitespace | isSpaceChar
半角スペース U+0020 | 消える | 消える | true | true | true
タブ U+0009 | 消える | 消える | true | true | false
改行LF U+000A | 消える | 消える | true | true | false
復帰CR U+000D | 消える | 消える | true | true | false
全角スペース U+3000 | 残る | 消える | true | true | true
NBSP U+00A0 | 残る | 残る | false | false | true
ゼロ幅スペース U+200B | 残る | 残る | false | false | false
BOM U+FEFF | 残る | 残る | false | false | false
ENスペース U+2002 | 残る | 消える | true | true | true
狭いNBSP U+202F | 残る | 残る | false | false | true
行区切り U+2028 | 残る | 消える | true | true | true
NUL U+0000 | 消える | 残る | false | false | false
単位区切り U+001F | 消える | 消える | true | true | false

この結果から読み取れることを整理します。

わかること 根拠になる行
strip() と isBlank() の判定は Character.isWhitespace と一致する すべての行で strip の「消える」と isWhitespace の true がそろっている
NBSP は isWhitespace では false、isSpaceChar では true NBSP、狭い NBSP の行
ゼロ幅スペースと BOM は、どの判定でも空白にならない U+200B、U+FEFF の行
タブと改行は isSpaceChar では false タブ、LF、CR の行

NBSP は「改行させない空白」という性質のため、Character.isWhitespace では空白に数えられません。 そのため strip() でも isBlank() でも対象外です。画面上は半角スペースと見分けがつかないので、「strip したのに空白が残る」「isBlank が false になる」というときは、まず NBSP を疑うと早く解決できます。

stripLeading・stripTrailing・isBlankの使い方

Java 11 では strip() と一緒に、先頭だけ・末尾だけを取り除くメソッドと、空白だけかどうかを調べるメソッドが加わりました。

public class StripVariants {
    public static void main(String[] args) {
        String s = "  会員 太郎  ";
        System.out.println("strip         : [" + s.strip() + "]");
        System.out.println("stripLeading  : [" + s.stripLeading() + "]");
        System.out.println("stripTrailing : [" + s.stripTrailing() + "]");
        System.out.println("length 前→後  : " + s.length() + " → " + s.strip().length());

        System.out.println("\"\".isEmpty()        = " + "".isEmpty());
        System.out.println("\"\".isBlank()        = " + "".isBlank());
        System.out.println("\"  \".isEmpty()      = " + "  ".isEmpty());
        System.out.println("\"  \".isBlank()      = " + "  ".isBlank());
        System.out.println("全角のみ.isBlank()   = " + " ".isBlank());
        System.out.println("全角のみ.trim().isEmpty() = " + " ".trim().isEmpty());
        System.out.println("NBSPのみ.isBlank()   = " + " ".isBlank());

        String same = "abc";
        System.out.println("変化なしのtrimは同じインスタンス  : " + (same.trim() == same));
        System.out.println("変化なしのstripは同じインスタンス : " + (same.strip() == same));
        String orig = " abc ";
        orig.strip();
        System.out.println("代入しないと元のまま : [" + orig + "]");
        orig = orig.strip();
        System.out.println("代入すると変わる     : [" + orig + "]");
    }
}

実行結果:

strip         : [会員 太郎]
stripLeading  : [会員 太郎  ]
stripTrailing : [  会員 太郎]
length 前→後  : 9 → 5
"".isEmpty()        = true
"".isBlank()        = true
"  ".isEmpty()      = false
"  ".isBlank()      = true
全角のみ.isBlank()   = true
全角のみ.trim().isEmpty() = false
NBSPのみ.isBlank()   = false
変化なしのtrimは同じインスタンス  : true
変化なしのstripは同じインスタンス : true
代入しないと元のまま : [ abc ]
代入すると変わる     : [abc]

ポイントは4つあります。

  • 取り除かれるのは前後だけです。「会員 太郎」の間にある半角スペースは、どのメソッドでも残ります。途中の空白を消す方法は後の節で扱います。
  • isEmpty() は長さ 0 かどうか、isBlank() は空白だけかどうかを調べます。入力欄の必須チェックのように「スペースだけの入力も未入力として扱いたい」場面では isBlank() が合います。
  • 全角スペースだけの文字列は、trim().isEmpty() では false になります。 Java 8 のころによく使われた s.trim().isEmpty() は、全角スペースだけの入力を「入力あり」と判定します。Java 11 以降は s.isBlank() に置き換えると、全角スペースだけの入力も未入力として扱えます。
  • String は変更できないオブジェクトなので、結果は代入して受け取ります。 orig.strip(); と書いただけでは元の変数は変わりません。orig = orig.strip(); のように受け取ってください。

isEmptyとisBlankの違い

文字列 isEmpty() isBlank() trim().isEmpty()
空文字 "" true true true
半角スペース2つ false true true
全角スペースのみ false true false
NBSP のみ false false false

4行目のとおり、NBSP だけの文字列は isBlank() でも false です。NBSP まで未入力として扱いたいときは、次の節の stripAll で前後を取り除いてから isEmpty() で調べます。

stripで消えない文字を正規表現で消す

NBSP・ゼロ幅スペース・BOM は strip() では残るので、正規表現で前後から取り除きます。 次の stripAll は、Unicode の White_Space 属性を持つ文字(NBSP を含みます)に、ゼロ幅スペースの仲間と BOM を加えた文字を、先頭と末尾からまとめて取り除きます。

import java.util.regex.Pattern;

public class StripAll {
    // 空白類(White_Space)+ゼロ幅スペース類+BOM を前後から取り除く
    private static final Pattern EDGE = Pattern.compile(
        "^[\\p{IsWhite_Space}\\u200B\\u200C\\u200D\\u2060\\uFEFF]+"
      + "|[\\p{IsWhite_Space}\\u200B\\u200C\\u200D\\u2060\\uFEFF]+$");

    static String stripAll(String s) {
        return s == null ? null : EDGE.matcher(s).replaceAll("");
    }

    public static void main(String[] args) {
        String s = " ​  在庫 一覧  ​ ";
        System.out.println("strip    : [" + show(s.strip()) + "]");
        System.out.println("stripAll : [" + show(stripAll(s)) + "]");
        System.out.println("null     : " + stripAll(null));
    }

    // 見えない文字をコードポイント表記にして表示する
    static String show(String s) {
        StringBuilder sb = new StringBuilder();
        s.codePoints().forEach(cp -> {
            if (cp == 0x00A0 || cp == 0x200B || cp == 0xFEFF || cp == 0x3000) {
                sb.append(String.format("<U+%04X>", cp));
            } else {
                sb.appendCodePoint(cp);
            }
        });
        return sb.toString();
    }
}

実行結果:

strip    : [<U+FEFF><U+00A0><U+200B><U+3000> 在庫 一覧 <U+3000><U+200B><U+00A0>]
stripAll : [在庫 一覧]
null     : null

strip() は、先頭の BOM と末尾の NBSP が「空白ではない文字」として壁になり、その内側にある全角スペースにも届いていません。stripAll は、前後の見えない文字をまとめて取り除き、途中の半角スペースは残しています。

正規表現の部品は次のとおりです。

部品 意味
^ と + 先頭から続く1文字以上
+ と $ 末尾まで続く1文字以上
\p{IsWhite_Space} Unicode の White_Space 属性を持つ文字(半角・全角スペース、タブ、改行、NBSP など)
​ ‌ ‍ ⁠ ゼロ幅スペース、ゼロ幅非接合子、ゼロ幅接合子、単語結合子
 BOM(ゼロ幅ノーブレークスペース)

show メソッドは、見えない文字をコードポイント表記に置き換えて表示するための補助です。「空白が残っている気がする」ときに文字の正体を調べる道具としても使えます。

Pattern を static final の定数にしているのは、正規表現の組み立てを1回で済ませるためです。同じ処理を何度も呼ぶ場合は、この形にしておくと毎回の組み立てを省けます。

見えない文字が混ざる場面

文字 混ざりやすい場面
NBSP(U+00A0) Web ページや文書作成ソフトからコピーした文字列、HTML の &nbsp;
ゼロ幅スペース(U+200B) Web ページ、チャットツールからコピーした文字列
BOM(U+FEFF) BOM 付き UTF-8 で保存されたテキストや CSV の1行目の先頭
全角スペース(U+3000) 日本語入力がオンのまま入力した値

CSV の1列目の見出しだけが一致しない、Map のキーで値が取れない、といった現象は、1行目の先頭に付いた BOM が原因のことがあります。読み込んだ直後に stripAll を通しておくと、後の比較が安定します。

文字列の途中の空白をreplaceAllで消す

trim() も strip() も前後だけが対象です。途中の空白を消すには replace か replaceAll を使います。 対象にしたい空白の範囲で、書き方が変わります。

public class RemoveInner {
    public static void main(String[] args) {
        String s = " 東京都 千代田区 1-2-3\t備品 室 ";
        // 1) 半角スペースだけ消す(正規表現を使わない)
        System.out.println("replace(\" \", \"\")        : [" + s.replace(" ", "") + "]");
        // 2) \s は既定では ASCII の空白のみ
        System.out.println("replaceAll(\"\\\\s\", \"\")     : [" + s.replaceAll("\\s", "") + "]");
        // 3) 全角スペースも対象にする
        System.out.println("replaceAll(\"[\\\\s ]\", \"\")  : [" + s.replaceAll("[\\s ]", "") + "]");
        // 4) Unicode の空白をまとめて消す(NBSP も含む)
        System.out.println("\\p{IsWhite_Space}       : [" + s.replaceAll("\\p{IsWhite_Space}", "") + "]");
        // 5) (?U) を付けると \s が Unicode の空白に広がる
        System.out.println("(?U)\\s                  : [" + s.replaceAll("(?U)\\s", "") + "]");
        // 6) 連続する空白を半角スペース1つにまとめ、前後を落とす
        String t = "  注文   番号 \t 1001  ";
        System.out.println("まとめる                : [" + t.replaceAll("[\\s ]+", " ").strip() + "]");
        // 7) 正規表現を使わずに全角スペースだけ消す
        System.out.println("replace(全角, \"\")       : [" + s.replace(" ", "") + "]");
    }
}

実行結果(1〜2行目に見える広い空きは、残ったタブと NBSP です):

replace(" ", "")        : [東京都 千代田区1-2-3    備品 室]
replaceAll("\\s", "")     : [東京都 千代田区1-2-3備品 室]
replaceAll("[\\s ]", "")  : [東京都千代田区1-2-3備品 室]
\p{IsWhite_Space}       : [東京都千代田区1-2-3備品室]
(?U)\s                  : [東京都千代田区1-2-3備品室]
まとめる                : [注文 番号 1001]
replace(全角, "")       : [ 東京都千代田区 1-2-3 備品 室 ]

結果を表にまとめます。

書き方 半角スペース タブ・改行 全角スペース NBSP
replace(" ", "") 消える 残る 残る 残る
replaceAll("\\s", "") 消える 消える 残る 残る
replaceAll("[\\s ]", "") 消える 消える 消える 残る
replaceAll("\\p{IsWhite_Space}", "") 消える 消える 消える 消える
replaceAll("(?U)\\s", "") 消える 消える 消える 消える
replace(" ", "") 残る 残る 消える 残る

押さえておきたい点は次の3つです。

  • 正規表現の \s は、既定では半角スペース・タブ・改行などの ASCII の空白だけを表します。全角スペースは対象外です。全角スペースも消したいときは [\\s ] のように文字クラスへ全角スペースを足します。
  • (?U) を先頭に付けると、\s が Unicode の空白まで広がります。 実行結果のとおり、全角スペースと NBSP も消えました。\p{IsWhite_Space} と同じ結果です。
  • replace は正規表現を使わない置換です。半角スペースだけ、全角スペースだけ、と対象が1種類に決まっているなら replace のほうが読みやすくなります。

連続した空白を1つにまとめる

空白を全部消すのではなく、「続いた空白を半角スペース1つにそろえる」 こともよくあります。上のコードの6番目がその書き方です。

String t = "  注文   番号 \t 1001  ";
String normalized = t.replaceAll("[\\s ]+", " ").strip();
// → "注文 番号 1001"

+ を付けて「1文字以上の連続」をまとめて半角スペース1つに置き換え、最後に strip() で前後を落としています。検索キーワードや氏名の表記をそろえるときに使える形です。

Java 8で全角スペースを消す代替コード

strip()・stripLeading()・stripTrailing()・isBlank() は Java 11 で加わったメソッドです。対象の版を Java 8 や 10 にしてコンパイルすると、次のようにメソッドが見つからないというエラーになります。

public class UseStrip {
    public static void main(String[] args) {
        String s = "  abc  ";
        System.out.println(s.strip());
    }
}
$ javac --release 8 -Xlint:-options UseStrip.java
UseStrip.java:4: error: cannot find symbol
        System.out.println(s.strip());
                            ^
  symbol:   method strip()
  location: variable s of type String
1 error

--release 10 でも同じエラーになり、--release 11 ではコンパイルが通ることを確かめています。

Java 8 で同じことをする方法は2つあります。 正規表現で書く方法と、Character.isWhitespace を使ったループで書く方法です。

public class Java8Trim {
    // Java 8 でも動く:前後の半角・全角スペースなどを取り除く(正規表現)
    static String trimFull(String s) {
        if (s == null) return null;
        return s.replaceAll("^[\\s ]+|[\\s ]+$", "");
    }

    // Java 8 でも動く:strip() と同じ判定(Character.isWhitespace)で前後を取り除く
    static String stripCompat(String s) {
        if (s == null) return null;
        int start = 0;
        int end = s.length();
        while (start < end && Character.isWhitespace(s.charAt(start))) start++;
        while (end > start && Character.isWhitespace(s.charAt(end - 1))) end--;
        return s.substring(start, end);
    }

    // Java 8 でも動く:isBlank() の代わり
    static boolean isBlankCompat(String s) {
        for (int i = 0; i < s.length(); i++) {
            if (!Character.isWhitespace(s.charAt(i))) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String s = "  \t記事タイトル  \n";
        System.out.println("trim        : [" + s.trim() + "]");
        System.out.println("trimFull    : [" + trimFull(s) + "]");
        System.out.println("stripCompat : [" + stripCompat(s) + "]");
        System.out.println("isBlankCompat(全角のみ) : " + isBlankCompat(" "));
        System.out.println("isBlankCompat(\"a\")     : " + isBlankCompat("a"));
    }
}

実行結果:

trim        : [     記事タイトル ]
trimFull    : [記事タイトル]
stripCompat : [記事タイトル]
isBlankCompat(全角のみ) : true
isBlankCompat("a")     : false

このファイルは javac --release 8 -Xlint:-options Java8Trim.java でコンパイルが通ることを確かめています。Character.isWhitespace は以前の版から使えるメソッドなので、Java 8 でもそのまま書けます。

メソッド 特徴 向いている場面
trimFull(正規表現) 1行で書ける。対象の文字を文字クラスに足しやすい NBSP なども足して調整したいとき
stripCompat(ループ) strip() と同じ判定。正規表現を使わない Java 11 の strip() と結果をそろえたいとき
isBlankCompat isBlank() と同じ判定 必須チェック

将来 Java 11 以降へ移るときは、stripCompat の呼び出しを strip() に、isBlankCompat を isBlank() に置き換えるだけで済みます。

入力値の整形でよく使う書き方

ここまでのメソッドを、入力値を扱う場面に当てはめた例です。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class InputCleanup {
    public static void main(String[] args) {
        // 1) 入力値を比較する前に strip する
        String input = " tanaka ";
        System.out.println("そのまま比較   : " + input.equals("tanaka"));
        System.out.println("trim して比較  : " + input.trim().equals("tanaka"));
        System.out.println("strip して比較 : " + input.strip().equals("tanaka"));

        // 2) カンマ区切りの各項目を strip する
        String line = " りんご , みかん , ぶどう";
        List<String> items = Arrays.stream(line.split(","))
            .map(String::strip)
            .collect(Collectors.toList());
        System.out.println(items);

        // 3) 空白だけの行を取り除く
        String text = "1行目\n   \n \n4行目\n";
        List<String> lines = text.lines()
            .filter(l -> !l.isBlank())
            .collect(Collectors.toList());
        System.out.println(lines);

        // 4) null かもしれない値は、先に null を確認する
        String name = null;
        String safe = (name == null) ? "" : name.strip();
        System.out.println("null を空文字に : [" + safe + "]");

        // 5) 必須チェックは isBlank で(null は先に確認)
        String comment = "  ";
        boolean missing = (comment == null || comment.isBlank());
        System.out.println("未入力として扱う : " + missing);
    }
}

実行結果:

そのまま比較   : false
trim して比較  : false
strip して比較 : true
[りんご, みかん, ぶどう]
[1行目, 4行目]
null を空文字に : []
未入力として扱う : true
  • 比較の前に strip() します。前に全角スペース、後ろに半角スペースが付いた入力は、trim() では全角スペースが残るため equals が false のままです。
  • split した各項目は map(String::strip) でまとめて整えられます。メソッド参照で書けるので短く済みます。
  • 空白だけの行は isBlank() で除外できます。lines() も Java 11 で加わったメソッドで、文字列を行ごとの Stream にします。
  • null に対して strip() を呼ぶと NullPointerException になるので、null の可能性がある値は先に確認します。

つまずきやすい点と直し方

現象 原因 直し方
trim() したのに空白が残る 全角スペースは trim() の対象外 strip() にする(Java 8 は trimFull)
strip() したのに空白が残る NBSP・ゼロ幅スペース・BOM は strip() の対象外 stripAll(正規表現)を使う
strip() を呼んだのに変わらない 戻り値を受け取っていない s = s.strip(); と代入する
cannot find symbol(method strip()) コンパイル対象の版が Java 10 以前 Java 11 以降にするか、代替コードを使う
途中の空白が消えない trim / strip は前後だけが対象 replace / replaceAll を使う
replaceAll("\\s", "") で全角が残る \s は既定では ASCII の空白だけ [\\s ] か (?U)\\s にする
isBlank() が false になる NBSP などが含まれている stripAll の後に isEmpty() で調べる
NullPointerException null に対して呼んでいる 先に null を確認する

直す前と後

全角スペースだけの入力を未入力として扱いたい場合の例です。

// 直す前:全角スペースだけの入力が「入力あり」になる
if (name.trim().isEmpty()) {
    // 未入力のときの処理
}

// 直した後:全角スペースだけでも未入力として扱える(Java 11 以降)
if (name.isBlank()) {
    // 未入力のときの処理
}

先ほどの StripVariants の実行結果にあるとおり、全角スペースだけの文字列で trim().isEmpty() は false、isBlank() は true でした。

どれを使うかの判断表

条件 選ぶもの
Java 11 以降で、前後の空白を消したい strip()
先頭の字下げは残して、末尾だけ消したい stripTrailing()
末尾は残して、先頭だけ消したい stripLeading()
空白だけの入力を未入力として扱いたい isBlank()
コピーした文字列や外部ファイルの値を整えたい stripAll(NBSP・ゼロ幅スペース・BOM も対象)
途中の空白も消したい replaceAll
Java 8 で動かす必要がある trimFull または stripCompat
既存コードの動作を変えたくない trim() のまま(対象は 0x20 以下の文字)

新しく書くコードで Java 11 以降が使えるなら、strip() と isBlank() を基本にすると、全角スペースの扱いで迷う場面が減ります。trim() は以前から使われてきたメソッドで、今も同じ動作のまま使えます。既存コードを strip() に置き換えるときは、NUL のような制御文字の扱いが変わる点(trim では消え、strip では残る)だけ確認しておくと安心です。

よくある質問

Q. trim() と strip() はどちらを使えばよいですか? A. Java 11 以降なら strip() が合う場面が多いです。全角スペースを含む Unicode の空白を前後から取り除けます。trim() は U+0020 以下の文字だけが対象なので、全角スペースは残ります。

Q. 全角スペースを消すにはどう書きますか? A. 前後だけなら s.strip()、途中も含めるなら s.replace(" ", "") または s.replaceAll("[\\s ]", "") です。Java 8 では s.replaceAll("^[\\s ]+|[\\s ]+$", "") で前後の全角スペースを取り除けます。

Q. strip() しても空白が残るのはなぜですか? A. NBSP(U+00A0)、ゼロ幅スペース(U+200B)、BOM(U+FEFF)は Character.isWhitespace で空白と判定されないため、strip() の対象外です。この記事の stripAll のように、正規表現で対象の文字を指定して取り除きます。

Q. isEmpty() と isBlank() の違いは何ですか? A. isEmpty() は長さが 0 のときだけ true です。isBlank() は、長さが 0 のときに加えて、半角・全角スペースやタブ、改行だけでできている文字列でも true になります。

まとめ

  • trim() は U+0020 以下の文字、strip() は Unicode の空白を前後から取り除く。全角スペースは strip() で消える
  • strip()・stripLeading()・stripTrailing()・isBlank() は Java 11 以降。Java 10 以前では cannot find symbol になる
  • NBSP・ゼロ幅スペース・BOM は strip() でも残る。正規表現(stripAll)で取り除く
  • 途中の空白は replace / replaceAll で消す。\s は既定では ASCII の空白だけなので、全角は [\\s ] か (?U)\\s で対象にする
  • Java 8 では正規表現か Character.isWhitespace のループで同じ処理を書ける
  • 結果は代入して受け取る。空白の確認は [ ] で囲んで出力すると見分けやすい

参考・出典

  • Oracle「Java SE 21 API 仕様 String」(trim・strip・stripLeading・stripTrailing・isBlank の説明): https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Javaのtrimとstripの違い|全角スペースを消す方法と早見表」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?