最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【记录】Android中的正则表达式的使用

Android regex crifan 2835浏览 0评论

之前已经知道,Android中的开发,写app的代码,就是写Java代码:

【整理】Android开发相关知识总结

也折腾过简单的Java的正则表达式了:

java中的正则表达式:java.util.regex

现在需要,在Android的app中,通过代码,使用正则,去提取所需内容。下面记录过程:


1.网上找到:

http://developer.android.com/reference/java/util/regex/package-summary.html

结果此刻半天没打开。。。

2.参考:

Android中的正则表达式Regex使用

直接去写代码算了:

1
2
3
4
5
6
7
8
9
10
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
                //<p class="mid_tit">我的爱与你分享</p><p></p>
                Pattern titleP = Pattern.compile("<p\\s+class=\"mid_tit\">(?<title>.+?)</p>");
                Matcher matchedTitle = titleP.matcher(respHtml);
                Boolean foundTitle = matchedTitle.matches();
                if(foundTitle){
                    String title = matchedTitle.group(1);
                }

结果始终出错,最后才发现,原来是由于,此处Android中,不知道是哪个版本的Java,但肯定是Java 1.7之前的,所以带了命名的组,结果就出错了。

详细解释,见之前的折腾:

【已解决】Java的正则表达式java.util.regex中的命名的组(named group)

3.去掉带命名的组,才可以:

1
2
3
4
5
6
7
8
9
10
11
//<p class="mid_tit">我的爱与你分享</p><p></p>
Pattern titleP = Pattern.compile("<p\\s+class=\"mid_tit\">(.+?)</p>");
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();
}

然后就可以正常执行代码了。

但是此处遇到一个问题,那就是,用这部分的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
        //<p class="mid_tit">我的爱与你分享</p><p></p>
        Pattern titleP = Pattern.compile("<p\\s+class=\"mid_tit\">(.+?)</p>");
        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的一部分,即看似被截断了,或者有大小限制。

具体折腾过程参见:

【已解决】Android中,通过response.getEntity()去获得HttpClient返回的HttpResponse,只获得部分的HTML内容

接下来,就是要去解决返回的html是乱码,需要针对此处的GB2312的字符,解码为对应的Unicode字符。

 

【总结】

Android中的正则,还是和之前遇到的,Java中的一样,导入:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

后,就可以去使用了。

还是需要注意,如果想要提取内容,注意不要把find错用成matches了,否则由于match会是从字符串开始就去匹配,所以你只写了相应部分的字符串的正则,肯定是无法match的,所以肯定是找不到的。

正确写法是类似于下面的:

1
2
3
4
5
6
7
8
9
10
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
Pattern titleP = Pattern.compile("<p\\s+class=\"mid_tit\">(.+?)</p>"); #此处Android中的java,不支持命名的组
Matcher matchedTitle = titleP.matcher(respHtml);
//Boolean foundTitle = matchedTitle.matches(); //不要误写成了matches
Boolean foundTitle = matchedTitle.find();
if(foundTitle){
    String title = matchedTitle.group(1);
}

 

还是那句话,Java中的正则,不是一般的烂啊。。。

转载请注明:在路上 » 【记录】Android中的正则表达式的使用

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.525 seconds, using 22.15MB memory