2011-10-28 37 views
0

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

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字符。 (.*?)似乎不匹配它们。这个问题的原因是什么?我如何解决它?

+0

整个“我想使用正则表达式”是第一个错误;你会考虑只使用类似[jsoup(http://jsoup.org/)或[tagsoup(http://ccil.org/~cowan/XML/tagsoup/)呢?否则,[这可能是你](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 –

回答

1

你确定这是与“特殊ISO-8859-1”,而不是换行呢? .默认情况下不匹配行终止符。您也可以使用DOTALL标志启用行终止符的匹配。例如:

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

正如您在第一个代码片段中看到的那样,删除了新行符\ n和\ r。令人惊讶的是,你提到的国旗使正则表达式匹配那些特殊字符,所以它解决了这个问题。谢谢! –

+1

我实际上并没有注意到前面一行中的'replaceAll',但还有其他的行终止符不是'\ n'和'\ r'(例如:'\ v'和'\ f')。我经常遇到一些错误,因为'.'不符合我想要的所有内容,并且每次都是因为丢失了'DOTALL'。 –