「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(".+\\.*");
と書かなければいけません、という事のようで。