- JAVA
Javaのtrimとstripの違い|全角スペースを消す方法と早見表
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 の |
| ゼロ幅スペース(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期連続の黒字決算。