0

我使用 httpclient 来抓取 html。在我的代码中,我发现

html = html.replaceFirst("[cC][hH][aA][rR][sS][eE][tT]\\s*?=\\s*?([gG][bB]2312|[gG][bB][kK]|[gG][bB]18030)","charset=utf-8");

上面的代码导致 java.lang.OutOfMemoryError。总程序使用 251MB,replaceFirst 方法使用 64.8%,157MB,并且还在增长。我该如何避免这种情况,我需要一些帮助。这~

4

1 回答 1

1

第一点是:不要使用正则表达式进行 HTML 解析。请改用 HTML 解析器。其次,如果您已经有了这种模式并且只想稍微修复它,请尝试了解它的作用。

它实际上替换charset=GBK2312charset=GBK18030使用了charset=UTF-8非常不优化的方式。

因此,首先将您的正则表达式更改为以下内容:

charset=GBK(?:2312|18030)

我相信这已经给你带来了一些优势。但是这个正则表达式是区分大小写的。无需手动以小写和大写形式编写每个字符,而是Pattern直接使用:

Pattern p = Pattern.compile("charset=GBK(?:2312|18030)", Pattern.CASE_INSENSITIVE);
String newHtml = p.matcher(oldHtml).replaceFirst("charset=utf8");
于 2013-08-12T07:00:29.750 回答