【问题标题】:Android regex encodingAndroid 正则表达式编码
【发布时间】:2011-10-28 16:01:26
【问题描述】:

我正在使用 HttpClient 下载网站的源代码,然后我想使用正则表达式提取一些数据。不幸的是,该网站以 iso-8859-1 编码,这似乎引起了问题。这是下载网站的示例代码:

HttpGet query = new HttpGet(url);
HttpResponse queryResponse = httpClient.execute(query);
String queryText = EntityUtils.toString(queryResponse.getEntity()).replaceAll("\r", " ").replaceAll("\n", " ");

然后是表达式:

Pattern patter = Pattern.compile("<p class=\"qt\">(.*?)</p>");
Matcher matcher = pattern.matcher(queryText);
while (matcher.find()) // do something

问题在于,当有特殊的 iso-8859-1 字符时,它会丢失一些事件。 (.*?) 似乎与他们不匹配。这个问题的原因是什么?我该如何解决?

【问题讨论】:

  • 整个“我想使用正则表达式”是第一个错误;你会考虑只使用jsouptagsoup 之类的东西吗?否则this could be you.

标签: android regex httpclient iso-8859-1


【解决方案1】:

您确定这与“特殊 iso-8859-1 字符”而不是换行符有关吗? . 默认不匹配行终止符。您也可以使用DOTALL 标志来启用行终止符的匹配。例如:

Pattern patter = Pattern.compile("<p class=\"qt\">(.*?)</p>", Pattern.DOTALL);

【讨论】:

  • 换行符 \n 和 \r 被删除,如您在第一个代码 sn-p 中所见。令人惊讶的是,您提到的标志导致正则表达式匹配那些特殊字符,因此它解决了问题。谢谢!
  • 我实际上并没有注意到前一行中的replaceAll,但是除了\n 和'\r' 之外还有其他行终止符(例如:\v\f)。我经常遇到 . 与我想要的所有内容不匹配的错误,而且每次都是因为缺少 DOTALL
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2011-02-07
相关资源
最近更新 更多