正則十八式-第三式:龍躍於淵

少年,見你骨骼精奇,是百年一遇的練武奇才,你我又是有緣人,隨爲師修煉吧正則表達式


接上篇:正則十八式-第二式:控鶴擒龍數據庫

藏扇仙:"徒兒,方纔確實從400多萬個字符中提取出了有用信息,不過嘛..."  
捷特:"嗯...,摻雜了一些廢料,師傅請寬心,待吾splite處理一下"
藏扇仙:"傻徒兒,4000多個字符串,你splite不耗時?"
捷特:"弟子愚鈍,還請師傅明示。"
複製代碼

[壹] 金鱗困穴,龍躍於淵

1.分組:金鱗豈是池中物。
藏扇仙:"上面猶如一條龍困在池中,被雜草束縛,如今你須要發現他,併爲他破除障礙..."  
捷特:"弟子該如何作?"
藏扇仙:"咱們須要獲取的地方是 .* 對應的部位,可使用分組"
捷特:"也就是能夠定點取?"
藏扇仙:"然也,方法很簡單,加個括號就好了。"  
複製代碼

藏扇仙:"matcher.group(1)說明取第一分組。這樣即可,龍躍於淵"編程

private static void regexHtml(String target) {
    String regex="username\">(.*?)<";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(target);
    while (matcher.find()){
        System.out.println(matcher.group(1));
    }
}
複製代碼


2.組數
捷特:"這麼說,默認是第0組。"
藏扇仙:"是的,上面若是matcher.group(0)就和原先結果同樣"
捷特:"明白了,是否是多少個括號就是多少組?"
複製代碼

藏扇仙:"能夠用matcher.groupCount()獲取組數,且看下錶。"bash

正則 組數 目標所在組
username\">.*?< 0 -
username\">(.*?)< 1 1
(username)">(.*?)(<) 3 2
(username)(">(.*?)(<)) 4 3

捷特:"經過個人火眼金睛發現,數左括號就好了,第幾個就是第幾組。"
藏扇仙:"秀兒如你,確實如此。"微信


3.組命名
捷特:"這1,2,3,4的,幾百個組的正則,一個個數還不瘋掉?"
藏扇仙:"喲,小樣,還有志向寫幾百個組的正則?好吧,爲師把看家本領交給你--組命名。"
捷特:"就是嘛,我一猜就能命名。"
複製代碼

藏扇仙:"在組內最前面?<Gname>就能夠取名了,爲了明瞭,爲師喜歡加個G前綴。"post

private static void regexHtml(String target) {
    String regex="(username)(\">(?<Gname>.*?)(<))";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(target);
    while (matcher.find()){
        System.out.println(matcher.group("Gname"));
    }
}
複製代碼

[貳] 三千飛龍躍於淵

1.測試數據
藏扇仙:"下面是一片亂七八糟的文章,出現了不少日期,你把年月日過濾出來。"
捷特:"這個簡單,看我--龍躍於淵"
複製代碼


2.提取日期
private static void regexToday(String target) {
    String regex="(?<Gyear>\\d{4}年)(?<Gmonth>\\d{2}月)(?<Gday>\\d{2}日)";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(target);
    while (matcher.find()){
        System.out.println(matcher.group("Gyear"));
        System.out.println(matcher.group("Gmonth"));
        System.out.println(matcher.group("Gday"));
    }
}
複製代碼


3.正則表達式的分析和逐步完善

藏扇仙:"正則最難的是細心觀察,這裏還有一些負數沒法匹配。"
捷特:"我再來想辦法。"測試

---->[正則表達式的分析]----
原正則  (?<Gyear>\\d{4}年)(?<Gmonth>\\d{2}月)(?<Gday>\\d{2}日)
這隻能匹配連續四個數字的年分,2個數字的月份,2個數字的日期,條件比較苛刻。
適配   -45年1月1日
如今   (?<Gyear>-?\d{1,4}年)(?<Gmonth>\d{1,2}月)(?<Gday>\d{1,2}日)

-? 表明有沒有-號均可以匹配到,
再將原來苛刻的\d{4}等放低要求\d{1,4},說明有一個數字就OK了
複製代碼


4.添加需求
藏扇仙:"如今粗略獲取一下日期後的文字,不要求很是精確。"
捷特:"這個我來想一想...簡單的,加個\W+就好了只不過沒法匹配到數字。"
藏扇仙:"這篇字符串自己的質量也不高,規則性不強。能配成這樣已經不錯了。"

(?<Gyear>-?\d{1,4}年)(?<Gmonth>\d{1,2}月)(?<Gday>\d{1,2}日)(?<Ginfo>\W+)
複製代碼

如今,你應該學會分組了吧,這樣日期和簡單的簡介就能很容易捕獲。
插入數據庫什麼的也不是難事。你get了嗎?ui


[叄]、實戰練習

曾經寫過一篇:玩轉字符串篇--代碼自動生成,解放雙手基本上都有splite來處理字符串
如今會了這第三式,原來so,easy搞一波。下面的Android自定義控件,你們應該不陌生。
需求:1.拿到類名2.拿到屬性名attr, 3.拿到屬性名對應的類型formatspa

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TolyProgressBar">
        <attr name="z_pb_bg_color" format="color"/>
        <attr name="z_pb_bg_height" format="dimension"/>
        <attr name="z_pb_on_color" format="color"/>
        <attr name="z_pb_on_height" format="dimension"/>
        <attr name="z_pb_txt_color" format="color"/>
        <attr name="z_pb_txt_size" format="dimension"/>
        <attr name="z_pb_txt_offset" format="dimension"/>
        <attr name="z_pb_txt_gone" format="boolean"/>
    </declare-styleable>
</resources>
複製代碼

跟我一塊兒喊:控鶴擒龍,龍躍於淵 這樣就能獲取原始數據,以後怎麼玩均可以。3d

private static void regexAttr(String target) {
    String regex="<attr name=\"(?<Gattr>.*?)\".*format=\"(?<Gtype>.*?)\"";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(target);
    while (matcher.find()){
        System.out.println(matcher.group("Gattr")+" 類型:"+matcher.group("Gtype"));
    }
}
複製代碼

對於一些模板、代碼生成或字符串處理的工做,最主要的就是獲取須要的字段
控鶴擒龍,龍躍於淵這兩招是最基本的正則處理,固然也是最有效的實用的。


對於類名的獲取同理。能夠用一個Map來盛放匹配的數據以供使用

private static void regexAttr(String target) {
    Map<String,String> map =new HashMap<>();
    String regex="<attr name=\"(?<Gattr>.*?)\".*format=\"(?<Gtype>.*?)\"";
    Matcher matcher = Pattern.compile(regex).matcher(target);
    while (matcher.find()){
        map.put(matcher.group("Gattr"),matcher.group("Gtype"));
    }
    String regexClass="<declare.*?\"(?<Gclass>.*?)\"";
    Matcher matcherClass = Pattern.compile(regexClass).matcher(target);
    while (matcherClass.find()){
        map.put("ClassName",matcherClass.group("Gclass"));
    }
    System.out.println(map);
}
複製代碼

後記

1----本文由張風捷特烈原創,轉載請註明
2----若是有什麼想要交流的,歡迎留言。也能夠加微信:zdl1994328
3----我的能力有限,若有不正之處歡迎你們批評指證,一定虛心改正
4----看到這裏,我在此感謝你的喜歡與支持,掃碼關注-編程之王

icon_wx_200.png
相關文章
相關標籤/搜索