0

以下是我的代码的快照,输入文件大小为 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,正则表达式 HasNext 以空行开头,多平台支持

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

更新

根据要求,一个小的堆栈跟踪:

http://pastebin.com/dcJ1jdkf

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

http://pastebin.com/EYMsbrKj

4

2 回答 2

3

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

只要每一行至少有一个字符长,这个正则表达式就会一次匹配整个文件。如果有空行,那么它将匹配跨越至少两行的空行之间的所有块。如果这就是你真正打算做的,有一个更好的方法来做到这一点:

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

为了避免对正则表达式引擎进行不必要的回溯,您可以使所有量词都具有所有格

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

有或没有所有格量词,这个正则表达式匹配如下:

屏幕截图 RegexBuddy

于 2012-11-05T21:16:37.020 回答
0

我认为你会更容易匹配标记本身而不是分隔符。这就是该findWithinHorizon()方法的真正用途:Scanner 首选操作模式的替代方案,由hasNextXXX()andnextXXX()方法表示。

"(?m)^\\w+;\\w+$(?:\r?\n\\w+(?:;\\w+)+$)+"

您没有详细说明您的数据格式,所以我只使用了与您的示例匹配的最简单的正则表达式。

于 2012-11-05T22:48:18.117 回答