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 のあらゆる空白文字を扱うとは限りません。