巧用正則匹配解析返回?cái)?shù)據(jù)

1.應(yīng)用技術(shù)

使用java.util.regex包下的Pattern和Matcher兩個(gè)類

  • Pattern類

    • 創(chuàng)建正則表達(dá)式
      用于創(chuàng)建一個(gè)正則表達(dá)式,也可以說(shuō)創(chuàng)建一個(gè)匹配模式羔杨,它的構(gòu)造方法是私有的,不可以直接創(chuàng)建,但可以通過(guò)Pattern.complie(String regex)簡(jiǎn)單工廠方法創(chuàng)建一個(gè)正則表達(dá)式抹腿。
     Pattern p=Pattern.compile("\\w+"); 
    
    • 分隔字符串
      Pattern有一個(gè)split()方法,用于分隔字符串,并返回一個(gè)String[]。
    Pattern p=Pattern.compile("\\d+"); 
    String[] str=p.split("我的QQ是:456456我的電話是:0532214我的郵箱是:aaa@aaa.com");
    //結(jié)果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:aaa@aaa.com" 
    
    • 用于快速匹配字符串(Pattern的靜態(tài)方法)
      matches是一個(gè)靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串兵拢。
    Pattern.matches("\\d+","2223");//返回true 
    Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 
    Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到 
    
  • Matcher類

    • 創(chuàng)建匹配器
      Matcher類的構(gòu)造方法也是私有的,不能隨意創(chuàng)建,只能通過(guò)Pattern.matcher(CharSequence input)方法得到該類的實(shí)例介褥。
    Pattern p=Pattern.compile("\\d+"); 
    Matcher m=p.matcher("22bb23"); 
    m.pattern();//返回p 也就是返回該Matcher對(duì)象是由哪個(gè)Pattern對(duì)象的創(chuàng)建的 
    
    • Matcher類提供了對(duì)正則表達(dá)式的分組支持,以及對(duì)正則表達(dá)式的多次匹配支持(重點(diǎn))已慢,需要將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組——整個(gè)匹配  
         System.out.println("Group 1:"+matcher.group(1));//得到第一組匹配——與(or)匹配的  
         System.out.println("Group 2:"+matcher.group(2));//得到第二組匹配——與(ld!)匹配的,組也就是子表達(dá)式  
         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)));//從總匹配開(kāi)始索引到第1組匹配的結(jié)束索引之間子串——Wor  
        }  
     }  
    運(yùn)行結(jié)果:
     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.應(yīng)用場(chǎng)景

  • 返回?zé)o規(guī)則的數(shù)據(jù)佑惠,需要解析,如需要獲取code和uuid的值
//返回?cái)?shù)據(jù)
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的數(shù)據(jù)朋腋,需要解析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));

解析json格式數(shù)據(jù):


{
    "code":"1",
    "message":"ok",
    "data":{
        "totalCount":2,
        "pageCount":1,
        "rowsCount":2,
        "data":{
            "311715616060001932":{
                "BarCode":"8809016360267",
                "GoodsNo":"0",
                "HgGoodsNo":"311715616060001932",
                "SyQty":0,
                "Price":20.23,
                "GyQty":0,
                "PracticalQty":0,
                "GoodsBasisNo":"009603080029"
            }
        }
    }
}
//解析
GoodsStockDto goodsStockDto = new GoodsStockDto();
goodsStockDto.setGoodsSn(match("\"HgGoodsNo\":\"(\\w+)\"", responseContent));
goodsStockDto.setGoodsQty(match("\"SyQty\":([0-9.]+)", responseContent));
String rtnCode = match("\"code\":\"(\\d+)\"", responseContent);
if (!SUCCESS_CODE.equals(rtnCode))
{
    dto.setRtnCode(ThirdConstants.FAILED);
}
//字母加空白符
dto.setRtnMsg(match("\"message\":\"([A-Za-z\\s]+)\"", responseContent));
dto.setResult(goodsStockDto);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膜楷,隨后出現(xiàn)的幾起案子旭咽,更是在濱河造成了極大的恐慌,老刑警劉巖赌厅,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穷绵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡特愿,警方通過(guò)查閱死者的電腦和手機(jī)仲墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)揍障,“玉大人目养,你說(shuō)我怎么就攤上這事《镜眨” “怎么了癌蚁?”我有些...
    開(kāi)封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我努释,道長(zhǎng)碘梢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任伐蒂,我火速辦了婚禮痘系,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饿自。我一直安慰自己,他們只是感情好龄坪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布昭雌。 她就那樣靜靜地躺著,像睡著了一般健田。 火紅的嫁衣襯著肌膚如雪烛卧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天妓局,我揣著相機(jī)與錄音总放,去河邊找鬼。 笑死好爬,一個(gè)胖子當(dāng)著我的面吹牛局雄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播存炮,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炬搭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了穆桂?” 一聲冷哼從身側(cè)響起宫盔,我...
    開(kāi)封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎享完,沒(méi)想到半個(gè)月后灼芭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡般又,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年彼绷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倒源。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苛预,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笋熬,到底是詐尸還是另有隱情热某,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站昔馋,受9級(jí)特大地震影響筹吐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秘遏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一丘薛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邦危,春花似錦洋侨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至陵且,卻和暖如春裁僧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慕购。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工聊疲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沪悲。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓获洲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親可训。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昌妹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 一、 1握截、請(qǐng)用Java寫一個(gè)冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨(dú)云閱讀 1,355評(píng)論 0 6
  • 記一下有些shell zip命令不太好使飞崖,推薦使用tar晚上剛編譯了一個(gè)系統(tǒng)版本,準(zhǔn)備傳給同事測(cè)試谨胞,打開(kāi) 百度盤 ...
    PengboGai閱讀 1,082評(píng)論 0 0
  • 時(shí)間改變著一切固歪,一切改變著我們,原先看不慣的胯努,如今習(xí)慣了牢裳,曾經(jīng)很想要的,現(xiàn)在不需要了叶沛,開(kāi)始很執(zhí)著的蒲讯,后來(lái)很灑...
    梟玉閱讀 420評(píng)論 6 8