覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

JavaのString#trim

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進表記の出力もしています。
(以降のサンプルでもprintStrAndTrimedStrasciiHexDump は使いまわします)


実行結果

[ 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以下の文字を削ります。