少年,见你骨骼精奇,是百年一遇的练武奇才,你我又是有缘人,随为师修炼吧正则表达式
接上篇:正则十八式-第二式:控鹤擒龙数据库
藏扇仙:"徒儿,方才确实从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----看到这里,我在此感谢你的喜欢与支持,扫码关注-编程之王