「シェルでログファイル名を操作 - あしのあしあと」でやってたことを、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")); }