「java.util.regex.PatternSyntaxException: Dangling meta character」でハマった

Java正規表現で時間を浪費した腹いせに数年ぶりに覚え書き。

String fileName= "regex.html";

// [ファイル名].[拡張子]として判別したい
Pattern pattern = Pattern.compile("+\\.*");

// 正規表現にマッチしているかを判断すると…
pattern.matcher(fileName).matches();

上記のコードを実行すると、

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0

と出て怒られます。

理由としては、Pattern (Java Platform SE 6)にある(Java7の日本語版にはなかった…)

Perl では、表現 *a などの不正なマッチ構文や表現 abc] などのぶら下がり括弧を許容しており、それらをリテラルとみなす。このクラスでもぶら下がり括弧は受け入れるが、+、?、* などのぶら下がりメタキャラクタは許容せず、それらが見つかった場合は PatternSyntaxException をスローする

つまりJavaでは、ぶら下がりメタキャラクタの前に.を付与して、

Pattern pattern = Pattern.compile(".+\\.*");

と書かなければいけません、という事のようで。