巧用正则匹配解析返回数据
2018-12-19 本文已影响0人
嘻洋洋
1.应用技术
使用java.util.regex包下的Pattern和Matcher两个类
-
Pattern类
- 创建正则表达式
用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
Pattern p=Pattern.compile("\\w+");
- 分隔字符串
Pattern有一个split()方法,用于分隔字符串,并返回一个String[]。
Pattern p=Pattern.compile("\\d+"); String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com"); //结果:str[0]="我的QQ是:" str[1]="我的电话是:" str[2]="我的邮箱是:aaa@aaa.com"
- 用于快速匹配字符串(Pattern的静态方法)
matches是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串。
Pattern.matches("\\d+","2223");//返回true Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到 Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到
- 创建正则表达式
-
Matcher类
- 创建匹配器
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例。
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.pattern();//返回p 也就是返回该Matcher对象是由哪个Pattern对象的创建的
- Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持(重点),需要将Pattern与Matcher一起合作。
public static void main(String[] args) { // TODO Auto-generated method stub String str = "Hello,World! in Java."; Pattern pattern = Pattern.compile("W(or)(ld!)"); Matcher matcher = pattern.matcher(str); while(matcher.find()){ System.out.println("Group 0:"+matcher.group(0));//得到第0组——整个匹配 System.out.println("Group 1:"+matcher.group(1));//得到第一组匹配——与(or)匹配的 System.out.println("Group 2:"+matcher.group(2));//得到第二组匹配——与(ld!)匹配的,组也就是子表达式 System.out.println("Start 0:"+matcher.start(0)+" End 0:"+matcher.end(0));//总匹配的索引 System.out.println("Start 1:"+matcher.start(1)+" End 1:"+matcher.end(1));//第一组匹配的索引 System.out.println("Start 2:"+matcher.start(2)+" End 2:"+matcher.end(2));//第二组匹配的索引 System.out.println(str.substring(matcher.start(0),matcher.end(1)));//从总匹配开始索引到第1组匹配的结束索引之间子串——Wor } } 运行结果: Group 0:World! Group 1:or Group 2:ld! Start 0:6 End 0:12 Start 1:7 End 1:9 Start 2:9 End 2:12 Wor
- 创建匹配器
2.应用场景
- 返回无规则的数据,需要解析,如需要获取code和uuid的值
//返回数据
window.QRLogin.code = 200; window.QRLogin.uuid = "XXXXXXX"
//解决方法
Pattern UUID_PATTERN = Pattern.compile("window.QRLogin.code = (\\d+); window.QRLogin.uuid = \"(\\S+?)\";");
private String getUUID() {
String response = getForObject(URL_UUID);
Matcher matcher = UUID_PATTERN.matcher(response);
if (matcher.find() && StateCode.SUCCESS.equals(matcher.group(1))) {
return matcher.group(2);
}
return "";
}
- 返回xml的数据,需要解析skey,wxsid,pass_ticket等值
<error>
<ret>0</ret>
<message>OK</message>
<skey>xxx</skey>
<wxsid>xxx</wxsid>
<wxuin>xxx</wxuin>
<pass_ticket>xxx</pass_ticket>
<isgrayscale>1</isgrayscale>
</error>
解决方法:
public static String match(String reg, String text) {
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(text);
if (m.find()) {
return m.group(1);
}
return null;
}
loginSession.setSKey(match("<skey>(\\S+)</skey>", body));
loginSession.setWxSid(match("<wxsid>(\\S+)</wxsid>", body));
loginSession.setWxUin(match("<wxuin>(\\S+)</wxuin>", body));
loginSession.setPassTicket(match("<pass_ticket>(\\S+)</pass_ticket>", body));