RegEx 换行符 运行 变成 StackOverflowError

RegEx linebreaks run into an StackOverflowError

我在 Java 正则表达式中使用 \r\n|\n 来匹配换行符。我不关心 mac 之类的换行符。每次我 运行 我的代码,我都会收到这样的 WhosebugError:

java.lang.WhosebugError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$Neg.match(Pattern.java:4986)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4466)
at java.util.regex.Pattern$Slice.match(Pattern.java:3870)
at java.util.regex.Pattern$Branch.match(Pattern.java:4502)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$Branch.match(Pattern.java:4502)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$Loop.match(Pattern.java:4683)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
at java.util.regex.Pattern$Dollar.match(Pattern.java:3621)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4170)
at java.util.regex.Pattern$Curly.match(Pattern.java:4132)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4466)

等等...

如果删除 \r\n 就不会出现错误,所以只有 \n。但结果并不像它需要的那样...

!请注意,我要处理高达 140k 行的大型输入和大约 50k 场比赛,每场比赛有 5-6 组。较小的输入按预期工作。使用相同 RegEx 和相同输入的早期版本也同样有效。

提前致谢;)

编辑: 我在 while 循环中使用 matcher.find() 访问 java 匹配器。

交替通常会导致堆栈溢出问题(参见)。您可以使用以下模式 而无需交替 和可选模式:

\r?\n

这里,\r?匹配一个或零个CR符号,\n只匹配1个LF符号。

或者,使用通用

\R

supported beginning with Java 8.