Почему движок Java regex создает исключение StringIndexOutOfBoundsException для + повторения?

Я написал шаблон регулярных выражений, чтобы найти числа Фибоначчи (не важно, почему, я только что сделал). Работает замечательно, как и ожидалось (увидеть на 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 притяжательный падеж повторение (т.е.++ на основной «петле») имеет решающее значение, потому что вы не хотите возвращаться с этим алгоритмом сопоставления. Тем не менее, делая повторение обратно (то есть просто+ на главном "цикле") приводит не к несоответствиям, а к исключению времени выполнения !!! (как видно на 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 regex?

Ответы на вопрос(1)

Ваш ответ на вопрос