HOWTO · Java

Javaのtrim()とstrip()

このチュートリアルでは、Java の trim() メソッドと strip() メソッドの違いを示します。

このページの内容

Java では、String.trim() と String.strip() は、どちらも文字列の先頭と末尾にある条件を満たす文字を削除し、途中の文字は変更しません。違いは、どの文字を削除対象と判定するかです。従来の規則を使う場合は trim() を、Java 11 以降を利用でき、入力に対して Character.isWhitespace(int) の判定が適切な場合は strip() を使います。

Java の trim() と strip() の概要

項目 trim() strip()
利用可能になったバージョン Java 1.0 Java 11
文字の判定規則 コードポイントが U+0020 以下の先頭・末尾の文字を削除 Character.isWhitespace(int) が true を返す先頭・末尾の文字を削除
宣言されている型 String String
文字列の途中にある文字 変更しない 変更しない

どちらのメソッドも、条件を満たす両端の文字を取り除いた文字列を返します。たとえば、先頭と末尾の通常のスペースは両方で削除されますが、単語の間にあるスペースは残ります。重要なのは、一方が Unicode のあらゆる空白文字を処理するということではありません。それぞれに固有の文字判定規則があります。

trim() と strip() の空白文字の扱い

trim() は、数値としてのコードポイントが U+0020 以下である先頭または末尾の文字を削除します。通常のスペース U+0020、タブ、キャリッジリターンなどが対象です。Unicode の一般的な空白文字分類は使いません。その範囲を超える U+2005 などは、trim() を適用しても端に残ります。

strip() は、Character.isWhitespace(int) で文字を判定します。この規則では、U+0020 以外にも U+2005 や U+2001 など多くの空白文字が対象になりますが、Unicode のすべての空白区切り文字が含まれるわけではありません。特に、ノーブレークスペース U+00A0 はこの規則では strip() によって削除されません。したがって、strip() を Unicode のあらゆる空白文字を除去する処理と考えないでください。

いずれのメソッドも、削除するのは両端にある条件を満たす文字だけです。空白でない文字に挟まれたタブやスペースは、文字列に残ります。

Java のバージョンと API の詳細

trim() は Java 1.0 以来、String で利用できます。strip() は Java 11 で String に追加されたため、これを使うコードには Java 11 以降の API が必要です。strip() は String のメソッドであり、CharSequence インターフェースで宣言されているものではありません。Java の String APIには両方のメソッドが記載されています。また、Java の Character.isWhitespace(int) APIでは、strip() が使う文字判定が定義されています。古い Java API を対象にコンパイルする必要がある場合は、trim() を使うか、アプリケーションに必要な文字判定規則を正確に実装してください。

Java の例でメソッドを比較する

この例は Java 11 以降で実行してください。通常のスペース、タブとキャリッジリターン、U+2005、U+2001、ノーブレークスペース U+00A0 に対する結果を比較します。ソースコードでは Unicode エスケープを使い、対象のコードポイントを明確にしています。

このセクションのコードと表示されるラベルや出力は英語のままです。

public class TrimVsStrip {
    public static void main(String[] args) {
        String[] samples = {
            " www.delftstack.com ",
            "\t www.delftstack.com \r",
            "www.delftstack.com \u2005",
            "\u2001",
            "\u00A0"
        };

        for (String sample : samples) {
            System.out.println(sample.trim().equals(sample.strip()));
        }
    }
}
true
true
false
false
true

出力は、上記のサンプルと同じ順序で、各文字列に trim() と strip() を適用した結果を比較しています。最初の2つが true なのは、両方のメソッドが両端の通常のスペース、タブ、キャリッジリターンを削除するためです。次の2つは false です。strip() は Character.isWhitespace(int) の判定に従って U+2005 と U+2001 を削除しますが、trim() ではこれらが残ります。最後が true なのは、どちらのメソッドもノーブレークスペース U+00A0 を削除しないためです。U+2001 のサンプルはその文字だけで構成されているため、trim() では空でない文字列が残り、strip() では空文字列になります。

適切なメソッドを選ぶ

Java 11 以降を利用でき、アプリケーションで削除したい文字が Character.isWhitespace(int) の判定に合う場合は、strip() を選びます。U+0020 以下という、より限定された規則が必要な場合や、古い Java バージョンとの互換性が必要な場合は、trim() を選びます。ノーブレークスペースなども入力ポリシー上の対象に含める必要がある場合は、その規則を明示して適用してください。どちらのメソッドも Unicode のあらゆる空白文字を扱うとは限りません。