问题来自以下
(.|\n)*部分
p6:
Pattern p6=Pattern.compile("(BENCH:)((.|\n)*)(BENCH)((.|\n)*)(CITATION)");(.|\n)*可以在Oracle / OpenJDK JRE上编译为以下结构,其实现使用递归(请注意
GroupTail参考资料
Loop)来匹配
非确定性 模式的重复(在实现中,交替始终被视为 非确定性 )。
Prolog. Loop wrapperLoop [732768bb]. Greedy quantifier {0,2147483647} GroupHead. (DEBUG) local=0 Branch. Alternation (in printed order): Dot. (?:.), equivalent to [^nru0085u2028u2029] --- Single. Match pre point: U+000A LINE FEED (LF) --- BranchConn [204d080d]. Connect branches to sequel. GroupTail [214b9e0c]. (DEBUG) local=0, group=2. --[next]--> Loop [732768bb]在长字符串上,堆栈用完,所以得到
StackOverflowError。
如果要毫无例外地匹配任何字符,则应
.与
Pattern.DOTALLflag
一起单独使用。
您可以将标志传递给
Pattern.compile(String regex, int flags)
方法以打开整个表达式的标志:Pattern p6 = Pattern.compile("(BENCH:)(.*)(BENCH)(.*)(CITATION)", Pattern.DOTALL);或按照Jonny 5的评论中的建议,也可以使用内联标志
(?s)
:Pattern p6 = Pattern.compile("(?s)(BENCH:)(.*)(BENCH)(.*)(CITATION)");另外,您也可以打开子模式的标志
(?s:.*)
:Pattern p6 = Pattern.compile("(BENCH:)(?s:(.*))(BENCH)(?s:(.*))(CITATION)");
顺便说一句,您确定要
|onrable参加
p3吗?
Pattern p3 = Pattern.compile("(([H|h]on)|(HON)).*((ble)|BLE)(.*)");如果不需要,请
|从字符类中删除:
Pattern p3 = Pattern.compile("(([Hh]on)|(HON)).*((ble)|BLE)(.*)");我还看到捕获组数量过多。请检查并检查它们是否确实必要。



