我想要解析一个格式为Warc版本0.9的大型文本文件。这样的文本示例可以在这里找到。如果您查看该文本,您会发现整个文档由以下条目列表组成。
[Warc Headers]
[HTTP Headers]
[HTML Content]
我需要从每个条目中提取URL和HTML内容(请注意,示例文件由多个页面条目组成,每个条目的格式与上面的内容相同)。
我在Java中使用了以下正则表达式:
Pattern.compile("warc/0\\.9\\s\\d+\\sresponse\\s(\\S+)\\s.*\n\n.*\n\n(.*)\n\n", Pattern.DOTALL)
代码中的组1和组2分别代表URL和HTML内容。这段代码存在两个问题:
- 查找匹配非常慢。
- 只能匹配第一页。
Java 代码:
if(mStreamScanner.findWithinHorizon(PAGE_ENTRY, 0) == null){
return null;
} else {
MatchResult result = mStreamScanner.match();
return new WarcPageEntry(result.group(1), result.group(2));
}
问题:
- 为什么我的代码只解析第一页的内容?
- 有没有更快的方法以流式方式解析大量文本?
.*
改为.*?
可以提高性能,因为它会导致更少的回溯,并且甚至可能更适合您的使用。 - Andreas