美文网首页
巧用正则匹配解析返回数据

巧用正则匹配解析返回数据

作者: 嘻洋洋 | 来源:发表于2018-12-19 15:31 被阅读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));
    

    相关文章

      网友评论

          本文标题:巧用正则匹配解析返回数据

          本文链接:https://www.haomeiwen.com/subject/vtljkqtx.html