(今さら)Javaで正規表現で部分文字列を取得する

シェルでログファイル名を操作 - あしのあしあと」でやってたことを、Javaでやらないといけなくなった。要は、ファイル名に含まれる(最後の)8桁の数値を取得するという簡単な処理。
String#substringメソッドのような、char配列の操作だけでは面倒そうなので、正規表現を使って一発でいこうかなぁと。でも、Java正規表現って、String#matchesメソッドをまんま使うか、(繰り返し使う場合には)事前にPatternオブジェクトを生成しておいてMatcher#matchesメソッドでマッチさせるか、それくらいしか使ったことないなぁと。


で、部分文字列の取得方法をちょいと調べてみると、すぐに出てきた。

入力シーケンスの各部分シーケンスがこれらのグループとマッチされ、マッチするたびに部分シーケンスが保存されます正規表現グループの部分シーケンスは、前方参照として表現内であとで使用できます。 また、マッチ操作が完了したら、正規表現エンジンから取り出すこともできます

http://java.sun.com/javase/ja/6/docs/ja/api/java/util/regex/Pattern.html

やっぱりちゃんと、部分文字列が取り出せるとのこと。おまけに『前方参照として表現内であとで使用できます』って、こんなことまでできるのね。


で、ほしい部分の表現をカッコでくくって、Matcher#groupメソッドを使って、次のようになった。

    static Pattern FILE_NAME_PATTERN = Pattern.compile(".*([0-9]{8}).*");

    static String getLast8Numbers(String fileName) {
        return FILE_NAME_PATTERN.matcher(fileName).group(1);
    }

動かしてみると、どうもオッケーっぽい。

    @Test
    public void testGetLast8Numbers() {
        assertEquals("20110812", getLast8Numbers("abc_12345678.log_20110812.gz"));
    }