Por que o mecanismo de regex Java lança StringIndexOutOfBoundsException em uma repetição +?

Eu escrevi um padrão regex para encontrar números de Fibonacci (não importa o porquê, acabei de fazer). Funciona maravilhosamente conforme o esperado (veja em 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 possessivo repetição (ou seja,++ no "loop" principal) é crucial, porque você não deseja voltar atrás com esse algoritmo de correspondência. No entanto, tornar a repetição retornável (ou seja, apenas+ no "loop" principal) resulta não em incompatibilidades, mas em uma exceção de tempo de execução !!! (como visto em 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)

Alguém pode explicar o que aconteceu aqui? Isso é um bug no mecanismo de regex do Java?

questionAnswers(1)

yourAnswerToTheQuestion