Warum wirft die Java-Regex-Engine eine StringIndexOutOfBoundsException auf eine + Wiederholung?
Ich habe ein Regex-Muster geschrieben, um Fibonacci-Zahlen zu finden (es spielt keine Rolle, warum, ich habe es gerade getan). Es funktioniert wunderbar wie erwartet see auf 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
A besitzergreifen Wiederholung (d. h.++
auf der Hauptschleife ist entscheidend, da Sie mit diesem Matching-Algorithmus kein Backtracking wollen. Die Wiederholung kann jedoch rückverfolgt werden (d. H. Nur+
auf der Hauptschleife) führt nicht zu Fehlpaarungen, sondern zu einer Laufzeitausnahme !!! as gesehen auf 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)
ann jemand erklären, was hier passiert ist? Ist das ein Fehler in der Java-Regex-Engine?