为什么Java正则表达式引擎在+重复上抛出StringIndexOutOfBoundsException?错误 ID 6984178探索斐波那契形态关于算法
我已经写了一个正则表达式模式来查找斐波那契数列(为什么并不重要,我只是做了)。它如预期的那样出色地工作(见 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 正则表达式引擎中的错误吗?