TL; DR
Matcher
のAPIの背後にある設計上の決定は何ですか?
バックグラウンド
Matcher
私が予期していなかった振る舞いをしていて、正当な理由を見つけることができません。APIドキュメントには次のように書かれています。
作成されたマッチャーは、3種類の一致操作を実行するために使用できます。[...]これらの各メソッドは、成功または失敗を示すブール値を返します。一致の成功に関する詳細情報は、マッチャーの状態を照会することで取得できます。
APIドキュメントにさらに記載されているのは次のとおりです。
マッチャーの明示的な状態は、最初は未定義です。一致が成功する前にその一部を照会しようとすると、IllegalStateExceptionがスローされます。
例
String s = "foo=23,bar=42";
Pattern p = Pattern.compile("foo=(?<foo>[0-9]*),bar=(?<bar>[0-9]*)");
Matcher matcher = p.matcher(s);
System.out.println(matcher.group("foo")); // (1)
System.out.println(matcher.group("bar"));
このコードは
java.lang.IllegalStateException: No match found
で(1)
。これを回避するには、を許可する状態にするmatches()
か、または他のメソッドを呼び出す必要があります。次の作品:Matcher
group()
String s = "foo=23,bar=42";
Pattern p = Pattern.compile("foo=(?<foo>[0-9]*),bar=(?<bar>[0-9]*)");
Matcher matcher = p.matcher(s);
matcher.matches(); // (2)
System.out.println(matcher.group("foo"));
System.out.println(matcher.group("bar"));
matches()
atに呼び出しを追加すると、を呼び出す適切な状態に(2)
設定されます。Matcher
group()
質問、おそらく建設的ではない
このAPIがこのように設計されているのはなぜですか?でビルドするときに自動的に一致しないのはなぜですか?Matcher
Patter.matcher(String)