この単純な正規表現プログラム
import java.util.regex.*;
class Regex {
public static void main(String [] args) {
System.out.println(args[0]); // #1
Pattern p = Pattern.compile(args[0]); // #2
Matcher m = p.matcher(args[1]);
boolean b = false;
while(b = m.find()) {
System.out.println(m.start()+" "+m.group());
}
}
}
によって呼び出されjava regex "\d" "sfdd1"
、正常に実行されます。
ただし、#1をに置き換えるPattern p = Pattern.compile("\d");
と、不正なエスケープ文字を示すコンパイラエラーが発生します。#1では、コマンドライン引数で指定されたパターンも出力してみました。を印刷します。これは、#2で\d
置き換えられていることを意味します。\d
では、なぜ例外をスローしないのでしょうか。最後にPattern.compile()
取っているのは文字列引数ですが、不正なエスケープ文字を検出しませんか?誰かがこの振る舞いの理由を説明できますか?