Java,扫描大文件,findWithinHorizo​​n(p, 0) 抛出异常 java.lang.StackOverflowError

标签 java regex exception java.util.scanner

以下是我的代码的快照,输入文件大小为 45 Mb

Scanner fileScanner = new Scanner(file);
String scannedFarm;
try{

    Pattern p = Pattern.compile("^(?:.+(?:\\r?\\n|\\Z)){2,}",Pattern.MULTILINE);

    while((scannedFarm = fileScanner.findWithinHorizon(p, 0)) != null){ // Throws Exception
    ...
    ...

我将添加任何其他信息来阐明抛出异常的原因。 描述文件格式的相关问题可能会有所帮助:Java, Regular Expression HasNext starts with empty line, multi-platform support .

顺便说一句:这适用于像 super 按钮这样的小文件,对于较大的文件则失败,字符串是否具有从 findWithinHorizo​​n 返回的最大大小?

更新

按照要求提供一个小的堆栈跟踪:

http://pastebin.com/dcJ1jdkf

还有一个文件快照的小示例:

http://pastebin.com/EYMsbrKj

最佳答案

我不知道 Scanner 类的工作原理,但是无论 .findwithinHorizo​​n() 对正则表达式做什么,该正则表达式都非常奇怪。

只要每一行至少有一个字符长,此正则表达式将立即匹配整个文件。如果有空行,那么它将匹配空行之间至少跨越两行的所有 block 。如果这就是您真正想要做的,那么有更好的方法:

Pattern p = Pattern.compile("(?:^.+$(?:\\r?\\n)?){2,}", Pattern.MULTILINE);

为了避免正则表达式引擎不必要的回溯,您可以将所有量词设置为 possessive :

Pattern p = Pattern.compile("(?:^.++$(?:\\r?+\\n)?+){2,}+", Pattern.MULTILINE);

无论有或没有所有格量词,此正则表达式匹配如下:

Screenshot RegexBuddy

关于Java,扫描大文件,findWithinHorizo​​n(p, 0) 抛出异常 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13240385/

相关文章:

java - keytool -storepass 选项 - 这是我创建的密码吗?或者随证书一起提供给我的密码?

java - 手动触发 EJB Schedule 进行测试

java - 如何在 TestNG 中使用 Mockito 模拟 jdbc 连接和 resultSet

java - 在 Java 中如何将 "space and dot"替换为 "dot"?

java - 使用正则表达式搜索字符

java - 在我的以下程序中摆脱 java.lang.NullPointerException

javascript - 正则表达式匹配字母——包括非拉丁字母,但不包括表情符号

Python正则表达式捕获跨越多行的多个匹配项

c - 抛出异常 : Access violation writing location for Matlab Coder in Visual Studio

sqlite - 无法加载程序集 System.Data.SQLite.dll