正则十八式-第三式:龙跃于渊

news/2024/11/17 5:57:10/

少年,见你骨骼精奇,是百年一遇的练武奇才,你我又是有缘人,随为师修炼吧

  • 正则十八式-第一式:直捣黄龙
  • 正则十八式-第二式:控鹤擒龙
  • 正则十八式-第三式:龙跃于渊
  • 正则十八式-第四式 挫骨扬灰

接上篇:正则十八式-第二式:控鹤擒龙

藏扇仙:"徒儿,方才确实从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()获取组数,且看下表。"

正则组数目标所在组
username\">.*?<0-
username\">(.*?)<11
(username)">(.*?)(<)32
(username)(">(.*?)(<))43

捷特:"通过我的火眼金睛发现,数左括号就行了,第几个就是第几组。"
藏扇仙:"秀儿如你,确实如此。"


3.组命名
捷特:"这1,2,3,4的,几百个组的正则,一个个数还不疯掉?"
藏扇仙:"哟,小样,还有志向写几百个组的正则?好吧,为师把看家本领交给你--组命名。"
捷特:"就是嘛,我一猜就能命名。"
复制代码

藏扇仙:"在组内最前面?<Gname>就可以取名了,为了明了,为师喜欢加个G前缀。"

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了吗?


[叁]、实战练习

曾经写过一篇:玩转字符串篇--代码自动生成,解放双手基本上都有splite来处理字符串
现在会了这第三式,原来so,easy搞一波。下面的Android自定义控件,大家应该不陌生。
需求:1.拿到类名2.拿到属性名attr, 3.拿到属性名对应的类型format

<?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>
复制代码

跟我一起喊:控鹤擒龙,龙跃于渊 这样就能获取原始数据,之后怎么玩都可以。

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----看到这里,我在此感谢你的喜欢与支持,扫码关注-编程之王


http://www.ppmy.cn/news/668380.html

相关文章

你学习了Python,再看此文,这是一篇可以给你带来外快的文章,不夸张

这次文章为什么这么慢&#xff1f;是因为上周铲屎官独自撇下皮克啪&#xff0c;飞去日本给女朋友过18岁生日&#xff0c;浪了几天&#xff0c;啊哈哈哈哈。 这几天明显&#xff0c;北京的会开完了&#xff0c;空气质量&#xff0c;呵呵&#xff0c;呵呵呵呵。 那么这期我们来聊…

【渝粤题库】陕西师范大学201591 中国古代文学(二)作业(高起本)

《中国古代文学&#xff08;二&#xff09;》高起本作业 一、单项选择题 1.建安作家中&#xff0c;留存作品最多、成就最大的作家是&#xff1a; A曹操 B曹丕 C曹植 D王粲 E蔡琰 2&#xff0e;“骨气奇高&#xff0c;词采华茂”是《诗品》对下列哪位诗人作出的评价&#xff1a;…

webrtc 支持H265(二) ZLMediaKit通过datachannel通道转发视频流

webrtc datachannel的协商 ZLMediaKit支持webrtc接入&#xff0c;按正常流程&#xff0c;第一步需要协商出音视频通道。 但方案是只协商出datachannel&#xff0c;sdp如下&#xff1a; web 发起offer: v0^M o- 7161281774595815373 2 IN IP4 127.0.0.1^M s-^M t0 0^M agroup:…

SpringBoot2+Vue2实战(六)登录,注册实现及自定义异常处理,个人信息页面与昵称头像功能实现

一、登录&#xff1a; UserDto Data public class UserDto {private String username;private String password;Alias("nickname")private String nickname;private String avatarUrl; }UserController //登录PostMapping("/login")public Result login(R…

mybatis模拟05

SqlSession 添加 selectOne(String sqlId, Object data) method /*** description 查询一条数据* param sqlId&#xff1a;sql 语句的 id* param data:所需要的数据 * return result 查询结果*/ public Object selectOne(String sqlId, Object data){return null; } 实现 …

【Express】express注意点

express版本 5.x post的body 5.x版本无需安装 body-parser 中间件&#xff0c;只需简单配置即可使用body↓ 码 import express from express const app express() // 配置post的body app.use(express.json()) app.use(express.urlencoded({ extended: true }))app.post(/tes…

苹果6发布时间_2020苹果发布会直播入口+直播时间

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读…

苹果iOS 17正式发布!

手机中国新闻】北京时间6月6日凌晨1点&#xff0c;苹果正式召开WWDC开发者大会&#xff0c;全新的iOS 17系统正式发布。 据介绍&#xff0c;iOS 17系统的iMessage新增了check in功能&#xff0c;这是一种便捷、能保护隐私的位置分享功能。它可以告诉你的亲人朋友们你所在的位置…