赞
踩
之前已经知道,Android中的开发,写app的代码,就是写Java代码:
也折腾过简单的Java的正则表达式了:
现在需要,在Android的app中,通过代码,使用正则,去提取所需内容。下面记录过程:
1.网上找到:
结果此刻半天没打开。。。
2.参考:
直接去写代码算了:import java.util.regex.Matcher;
import java.util.regex.Pattern;
//
我的爱与你分享
Pattern titleP = Pattern.compile("
(?
.+?)");Matcher matchedTitle = titleP.matcher(respHtml);
Boolean foundTitle = matchedTitle.matches();
if(foundTitle){
String title = matchedTitle.group(1);
}
结果始终出错,最后才发现,原来是由于,此处Android中,不知道是哪个版本的Java,但肯定是Java 1.7之前的,所以带了命名的组,结果就出错了。
详细解释,见之前的折腾:
3.去掉带命名的组,才可以://
我的爱与你分享
Pattern titleP = Pattern.compile("
(.+?)
");Matcher matchedTitle = titleP.matcher(respHtml);
Boolean foundTitle = matchedTitle.matches();
if(foundTitle){
String title = matchedTitle.group(1);
}
else
{
Toast.makeText(getApplicationContext(), "找不到Songtaste歌曲的标题!", Toast.LENGTH_SHORT).show();
}
然后就可以正常执行代码了。
但是此处遇到一个问题,那就是,用这部分的代码:HttpGet request = new HttpGet(strSongUrl);
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse response = httpClient.execute(request);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
String respHtml = EntityUtils.toString(response.getEntity());
//etUrlOrId.setText(respHtml);
//
我的爱与你分享
Pattern titleP = Pattern.compile("
(.+?)
");Matcher matchedTitle = titleP.matcher(respHtml);
Boolean foundTitle = matchedTitle.matches();
if(foundTitle){
String title = matchedTitle.group(1);
}
else
{
Toast.makeText(getApplicationContext(), "找不到Songtaste歌曲的标题!", Toast.LENGTH_SHORT).show();
}
//System.out.println(response);
}
} catch (ClientProtocolException cpe) {
// TODO Auto-generated catch block
cpe.printStackTrace();
} catch (IOException ioe) {
// TODO Auto-generated catch block
ioe.printStackTrace();
}
去获得的respHtml,只有正常网页的html的一部分,即看似被截断了,或者有大小限制。
具体折腾过程参见:
接下来,就是要去解决返回的html是乱码,需要针对此处的GB2312的字符,解码为对应的Unicode字符。
【总结】
Android中的正则,还是和之前遇到的,Java中的一样,导入:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
后,就可以去使用了。
还是需要注意,如果想要提取内容,注意不要把find错用成matches了,否则由于match会是从字符串开始就去匹配,所以你只写了相应部分的字符串的正则,肯定是无法match的,所以肯定是找不到的。
正确写法是类似于下面的:import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern titleP = Pattern.compile("
(.+?)
"); #此处Android中的java,不支持命名的组Matcher matchedTitle = titleP.matcher(respHtml);
//Boolean foundTitle = matchedTitle.matches(); //不要误写成了matches
Boolean foundTitle = matchedTitle.find();
if(foundTitle){
String title = matchedTitle.group(1);
}
还是那句话,Java中的正则,不是一般的烂啊。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。