少年,見你骨骼精奇,是百年一遇的練武奇才,你我又是有緣人,隨爲師修煉吧正則表達式
接上篇:正則十八式-第二式:控鶴擒龍數據庫
藏扇仙:"徒兒,方纔確實從400多萬個字符中提取出了有用信息,不過嘛..."
捷特:"嗯...,摻雜了一些廢料,師傅請寬心,待吾splite處理一下"
藏扇仙:"傻徒兒,4000多個字符串,你splite不耗時?"
捷特:"弟子愚鈍,還請師傅明示。"
複製代碼
金鱗困穴,龍躍於淵
金鱗豈是池中物。
藏扇仙:"上面猶如一條龍困在池中,被雜草束縛,如今你須要發現他,併爲他破除障礙..."
捷特:"弟子該如何作?"
藏扇仙:"咱們須要獲取的地方是 .* 對應的部位,可使用分組"
捷特:"也就是能夠定點取?"
藏扇仙:"然也,方法很簡單,加個括號就好了。"
複製代碼
藏扇仙:"
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));
}
}
複製代碼
捷特:"這麼說,默認是第0組。"
藏扇仙:"是的,上面若是matcher.group(0)就和原先結果同樣"
捷特:"明白了,是否是多少個括號就是多少組?"
複製代碼
藏扇仙:"能夠用
matcher.groupCount()
獲取組數,且看下錶。"bash
正則 | 組數 | 目標所在組 |
---|---|---|
username\">.*?< |
0 | - |
username\">(.*?)< |
1 | 1 |
(username)">(.*?)(<) |
3 | 2 |
(username)(">(.*?)(<)) |
4 | 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"));
}
}
複製代碼
三千飛龍躍於淵
藏扇仙:"下面是一片亂七八糟的文章,出現了不少日期,你把年月日過濾出來。"
捷特:"這個簡單,看我--龍躍於淵"
複製代碼
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"));
}
}
複製代碼
藏扇仙:"正則最難的是細心觀察,這裏還有一些負數沒法匹配。"
捷特:"我再來想辦法。"測試
---->[正則表達式的分析]----
原正則 (?<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了
複製代碼
藏扇仙:"如今粗略獲取一下日期後的文字,不要求很是精確。"
捷特:"這個我來想一想...簡單的,加個\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.拿到屬性名對應的類型format
spa
<?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----看到這裏,我在此感謝你的喜歡與支持,掃碼關注-編程之王