gpt4 book ai didi

java - 使用正则表达式进行流模式匹配

转载 作者:行者123 更新时间:2023-12-02 05:59:03 25 4
gpt4 key购买 nike

我想解析一个以 Warc 0.9 版本格式化的大型文本文件。此类文本的示例是 here 。如果您看一下,您会发现整个文档由以下条目列表组成。

[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 内容。这段代码有两个问题:

  1. 找到匹配的速度非常慢。
  2. 仅与第一页匹配。

Java 代码:

if(mStreamScanner.findWithinHorizon(PAGE_ENTRY, 0) == null){
return null;
} else {
MatchResult result = mStreamScanner.match();
return new WarcPageEntry(result.group(1), result.group(2));
}

问题:

  • 为什么我的代码只解析第一页条目?
  • 是否有更快的方法以流式方式解析大文本?

最佳答案

我不会使用正则表达式来处理这些巨大的 HTML 字符串。改为依赖文档的结构怎么样?

例如像这样:

HashMap<String, String> output = new HashMap<>();
Pattern pattern = Pattern.compile("^warc\\/0\\.9\\s\\d+\\sresponse\\s(\\S+)\\s.*");

try (InputStreamReader is = new InputStreamReader(new FileInputStream("excerpt.txt"), "UTF-8")) {
try (BufferedReader br = new BufferedReader(is)) {
String line;
while ((line = br.readLine()) != null) {
Matcher matcher = pattern.matcher(line);

if (matcher.matches()) {
entityLoop: while (true) {
String url = matcher.group(1);

// skip header
int countEmptyLines = 0;
while ((line = br.readLine()) != null) {
if ("".equals(line)) {
countEmptyLines++;
if (countEmptyLines == 2) break;
}
}

// extract HTML
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.matches()) {
// got all HTML; store our findings
output.put(url, sb.toString());
continue entityLoop;
}
sb.append(line);
}
break; // no more url/html-entities available
}
}
}
}
} catch (IOException e) {
// do something smart
}

// now all your extracted data is stored in "output"

上述代码仍有改进的空间。但它应该能让您了解如何开始。

关于java - 使用正则表达式进行流模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34794835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com