JavaのString#trim
メソッドは、文字列の先頭と末尾のスペース(半角スペース)を除外した文字列を返してくれます。
例えば " sample1 " という先頭にも末尾にも半角スペースが入った文字列にtrim
を実行すると、
半角スペースが削られた "sample1" という文字列が返されます。
サンプルコード
import java.util.stream.Collectors; public class TrimSample1 { public static void main(String[] args) { String sample1 = " sample1 "; printStrAndTrimedStr(sample1); } private static void printStrAndTrimedStr(String str) { System.out.printf("[%s](%s) -> trim -> [%s](%s)\n\n", str, asciiHexDump(str), str.trim(), asciiHexDump(str.trim())); } private static String asciiHexDump(String ascii) { return ascii.chars() .mapToObj(b -> String.format("0x%02X", b)) .collect(Collectors.joining(" ")); } }
printStrAndTrimedStr
で、trim
実行前後の文字列を出力して、かつ16進表記の出力もしています。
(以降のサンプルでもprintStrAndTrimedStr
、asciiHexDump
は使いまわします)
実行結果
[ sample1 ](0x20 0x73 0x61 0x6D 0x70 0x6C 0x65 0x31 0x20) -> trim -> [sample1](0x73 0x61 0x6D 0x70 0x6C 0x65 0x31)
先頭と末尾の半角スペース(0x20)が削られています。
まぁ、ここまでは予定通りの動きな訳ですが、
Javaの String#trim
って、0x20以下の文字コードを先頭・末尾から削るようです。
改行コードを含む文字列で実行してみます。
サンプルコード
public class TrimSample2 { public static void main(String[] args) { String sample2 = " sample2\r\n"; printStrAndTrimedStr(sample2); } // さっきのサンプルと同じメソッドは省略 }
実行結果
[ sample2 ](0x20 0x73 0x61 0x6D 0x70 0x6C 0x65 0x32 0x0D 0x0A) -> trim -> [sample2](0x73 0x61 0x6D 0x70 0x6C 0x65 0x32)
半角スペース(0x20)だけではなく、改行コードのCR (0x0D) と LF (0x0A) も削られています。
今度は、末尾にNUL (NULL文字)を含む文字列で実行してみます。
サンプルコード
public class TrimSample3 { public static void main(String[] args) { byte[] bytes = "sample3 _".getBytes(); bytes[bytes.length - 1] = 0x00; String sample3 = new String(bytes); printStrAndTrimedStr(sample3); } // さっきのサンプルと同じメソッドは省略 }
実行結果
[sample3 ](0x73 0x61 0x6D 0x70 0x6C 0x65 0x33 0x20 0x00) -> trim -> [sample3](0x73 0x61 0x6D 0x70 0x6C 0x65 0x33)
この結果から、NULL文字 (0x00) も削られることが分かります。
まとめ
String#trim
は、先頭と末尾の 半角スペースだけではなく 改行コードなどの 0x20以下の文字を削ります。