フィボナッチ数を見つけるための正規表現パターンを作成しました (理由は関係ありませんが、作成しただけです)。期待どおりに素晴らしく動作します ( ideone.com を参照):
String FIBONACCI =
"(?x) .{0,2} | (?: (?=(\\2?)) (?=(\\2\\3|^.)) (?=(\\1)) \\2)++ . ";
for (int n = 0; n < 1000; n++) {
String s = new String(new char[n]);
if (s.matches(FIBONACCI)) {
System.out.print(n + " ");
}
} // 0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
このマッチング アルゴリズムで後戻りをしたくないため、所有格の繰り返し (つまり、メインの「ループ」) は非常に重要です。++
ただし、繰り返しをバックトラック可能にする (つまり+
、メインの「ループ」のみ) と、不一致ではなく、実行時例外が発生します!!! ( ideone.com で見られるように):
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: -1
at java.lang.String.charAt(String.java:686)
at java.lang.Character.codePointAt(Character.java:2335)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3344)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:3994)
at java.util.regex.Pattern$GroupCurly.match0(Pattern.java:3966)
at java.util.regex.Pattern$GroupCurly.match(Pattern.java:3916)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Matcher.match(Matcher.java:1127)
at java.util.regex.Matcher.matches(Matcher.java:502)
at java.util.regex.Pattern.matches(Pattern.java:930)
at java.lang.String.matches(String.java:2090)
誰かがここで何が起こったのか説明できますか? これは Java 正規表現エンジンのバグですか?