1. ホーム
  2. java

m}{n}(「ちょうどn回」2回)の仕組みは?

2023-08-23 17:18:50

質問

というわけで、どうにかこうにか(遊んでいるうちに)、以下のような正規表現があることに気がつきました。 \d{1}{2} .

論理的には、私にとって、それは意味するはずです。

(A digit exactly once) exactly twice, すなわち、数字がちょうど2回ある。

しかし、実際には、これは単に "数字がちょうど一回" を意味するように見えます(したがって {2} ).

String regex = "^\\d{1}{2}$"; // ^$ to make those not familiar with 'matches' happy
System.out.println("1".matches(regex)); // true
System.out.println("12".matches(regex)); // false

同様の結果は {n}{m,n} などを使っても同じような結果が得られます。

なぜこのようなことが起こるのでしょうか。regex / Java ドキュメントのどこかに明示されているのでしょうか、それとも Java 開発者がその場で決めただけなのでしょうか、それともバグなのでしょうか?

あるいは、実際には無視されず、まったく別のことを意味するのでしょうか?

あまり重要ではありませんが、正規表現の動作は全体的なものではありません。 ルビュラー は私が期待したとおりの動作をします。

注 - タイトルは主に、それがどのように動作するのか(なぜではない)を知りたいユーザーのために検索性を高めるためのものです。

どのように解決するのですか?

RegexBuddyでJavaの正規表現構文を使って正規表現を入力すると、以下のようなメッセージが表示されます。

量詞の前には、繰り返し使えるトークン "{2}" を置く必要があります。

グループ化を明示的に使用するように正規表現を変更する ^(\d{1}){2} に変更すると、このエラーは解決され、期待通りに動作します。


私は、java regex エンジンが単にエラー/式を無視し、これまでにコンパイルされたもので動作すると仮定しています。

編集

への参照は IEEE-標準 piet.tの回答 は、その仮定を支持しているように思えます。

編集2 (@fncomp に感謝)

完全を期すために、通常は (?:) を使い、グループの捕捉を回避します。完全な正規表現は次のようになります。 ^(?:\d{1}){2}