2011-10-28 13 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'が見つからなかったたびにバグを持っていました。 –