技術開発日記

技術やら日々思ったことを綴ってます。

ひらがなの検知

全角ひらがなを文字列から削除する方法を探していたところ、以下の方法があることを知って少し驚いた。

"abcあいう123".replaceAll("[\\p{InHiragana}]", "");
結果:abc123

ただ調べた感じだと、\p{InHiragana}は単にひらがなの範囲指定を文字列に置き換えているだけなので、
以下の記述の仕方と同じ意味になるとのこと。
[ぁ-ん]
[\u3040-\u309F]

ただ、なんとなくパフォーマンスのことが気になったので、どの表記が一番早いかを簡単に試してみた。

public class RegexSample {

    public static void main(String args[]) {

        System.out.println("☆[\\p{InHiragana}]☆");
        for (int i = 0; i < 5; i++){
            long start = System.currentTimeMillis();
            for (int j = 0; j < 10000000; j++) {
                "123ABCあいう".replaceAll("[\\p{InHiragana}]", "");
            }
            long stop = System.currentTimeMillis();
            System.out.println((stop - start));
        }

        System.out.println("☆[ぁ-ん]☆");
        for (int i = 0; i < 5; i++){
            long start = System.currentTimeMillis();
            for (int j = 0; j < 10000000; j++) {
                "123ABCあいう".replaceAll("[ぁ-ん]", "");
            }
            long stop = System.currentTimeMillis();
            System.out.println((stop - start));
        }

        System.out.println("☆[\\u3040-\\u309F]☆");
        for (int i = 0; i < 5; i++){
            long start = System.currentTimeMillis();
            for (int j = 0; j < 10000000; j++) {
                "123ABCあいう".replaceAll("[\\u3040-\\u309F]", "");
            }
            long stop = System.currentTimeMillis();
            System.out.println((stop - start));
        }
    }
}

結果
☆[\p{InHiragana}]☆
22938
22868
22886
22856
22858
☆[ぁ-ん]☆
12697
12710
12721
12720
12736
☆[\u3040-\u309F]☆
15050
15021
15045
15016
15254


どれも同じ意味のはずなのに、なんで違いが出るのかはちょっとわからないけど、もしかしたら正規表現をコンパイルするときに違いが出ているのかもしれない。
なので、最終的には[ぁ-ん]でひらがなを検知するのが一番いいのかもしれない。
ひらがなを直接書くのが若干気持ち悪い気はするけど。。。