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
我在 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