我使用httpclient来抓取htmls。在我的代码中,我找到了
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,并且正在增长。我怎么能避免这种情况,我需要一些帮助。部份〜
答案 0 :(得分:1)
第一点是:不要使用正则表达式进行HTML解析。请改用HTML解析器。 其次,如果你已经拥有这种模式,只是想稍微修复一下,试着去了解它的作用。
它实际上使用非优化方式将charset=GBK2312
或charset=GBK18030
替换为charset=UTF-8
。
因此,首先将正则表达式更改为以下内容:
charset=GBK(?:2312|18030)
我相信这个wiil已经给你带来了一些好处。但是这个正则表达式区分大小写。而不是手动编写小写和大写的每个字符直接使用Pattern
:
Pattern p = Pattern.compile("charset=GBK(?:2312|18030)", Pattern.CASE_INSENSITIVE);
String newHtml = p.matcher(oldHtml).replaceFirst("charset=utf8");