相关链接
- Excel目录
- 正则表达式 - 在线工具
- java8-api-online
目录
- P20 【正则】Pattern模式类、Matcher匹配器、元字符、分组捕获、反向引用
-
- 1.正则表达式 - 入门体验
-
- 1.1 入门1 提取文章中所有英语单词
- 1.2 入门2 提取文章中所有数字
- 1.3 入门3 提取文章中所有的英文单词和数字
- 1.4 入门4 提取百度热搜标题
- 1.5 入门5 找到所有的IP地址
- 2.正则表达式 - 底层实现
-
- 2.1 案例 找出四个连续数字
- 2.2 原理 Matcher源码
- 2.3 应用 找出四个连续数字,相等于2和3位
- 3.??正则表达式 - 基本语法
-
- 3.1 贪婪模式
- 3.2 分组捕获和反向引用
- 4.??正则匹配 - 使用元字符的案例
-
- 4.1 正则转义符 \\
- 4.2 分组捕获 - 反向引用内部
- 4.3 分组捕获 - 与外界反向引用(结巴去重)
- 4.4 反向否定零宽断言
- 5.??Pattern模式类
-
- 5.1 Pattern.CASE_INSENSITIVE 大小写不敏感模式
- 5.2 Pattern.COMMENTS 注释模式
- 5.3 Pattern.MULTILINE 多行匹配模式
- 6.Matcher匹配器
- 7.PatternSyntaxException异常类
- 8.正则表达式 - 应用案例
-
- 8.1 ??String.split()使用正则分割
- 8.2 ??String.matches()使用正则校验
- 8.3 邮箱校验
- 8.4 域名解析
- 8.5 百度爬虫热搜
- 8.6 LeetCode算法5
- 9.正则表达式 - 常用功能
-
- 9.1 解析hive建表语句
- 附录 设置在线工具
P20 【正则】Pattern模式类、Matcher匹配器、元字符、分组捕获、反向引用
今日要掌握的内容:
- 理解正则表达
- 理解正则表达式的底层原理
- 【应用】掌握正则表达式的基本语法
- 【应用】掌握正则表达式的三个常用类(1.模式类Pattern、2.匹配器Matcher、3.异常类PatternSyntaxException)
- 【应用】掌握正则表达式分组、捕获、反向引用
- 【应用】掌握正则表达式的元字符(1.限定符,2.选择匹配符,3.分组组合和反向引用符,4.特殊字符,5.字符匹配符,6.定位符)
- 【练习】应用实例
1.正则表达式 - 入门体验
正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),适用于大多数主流语言开发(C,Java,Python,SQl等)。是对字符串(包括普通字符 例如,a 到 z 之间的字母和特殊字符(称为)元字符)模式匹配技术可以快速处理文本(匹配、验证、过滤、清洗等)。
1.1 入门1 提取文章中所有英语单词
?
1995年,互联网的蓬勃发展Oak机会。为了使刚性单调的静态网页灵活,行业迫切需要一种软件技术来开发一个可以通过网络传播并跨平台运行的程序。因此,世界各地IT为此,企业投入了大量的人力、物力和财力。Sun公司想起了被搁置很久的公司。Oak,并重新审视软件编写的测试平台。由于它是根据嵌入式系统硬件平台的系统结构编写的,它非常小,特别适用于网络上的传输系统Oak也是一种简化的语言,程序很小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并可以与网页一起传输的网页Applet(Applet是一种将小程序嵌入网页执行的技术)Oak更名为Java(在申请注册商标时,发现Oak它已经被使用了,经过一系列的名字,最之后,最终使用了提议者1杯Java无意中提到了咖啡Java词语)。
?
Pattern pattern = Pattern.compile("[a-zA-Z] ");
?
【1.1 提取文章中的所有英文单词找到1: Oak 【1.1 提取文章中的所有英文单词找到2: IT
【1.1 提取文章中所有的英文单词】找到3: Sun
【1.1 提取文章中所有的英文单词】找到4: Oak
【1.1 提取文章中所有的英文单词】找到5: Oak
【1.1 提取文章中所有的英文单词】找到6: Sun
【1.1 提取文章中所有的英文单词】找到7: Applet
【1.1 提取文章中所有的英文单词】找到8: Applet
【1.1 提取文章中所有的英文单词】找到9: Oak
【1.1 提取文章中所有的英文单词】找到10: Java
【1.1 提取文章中所有的英文单词】找到11: Oak
【1.1 提取文章中所有的英文单词】找到12: Java
【1.1 提取文章中所有的英文单词】找到13: Java
案例代码一
package com.groupies.base.day20;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** * @author GroupiesM * @date 2021/09/09 * @introduction 1.1 正则快速入门 - 提取文章中所有的英文单词 */
public class Demo01Regexp {
public static void main(String[] args) {
String content = "1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的" +
"静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通" +
"过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的" +
"人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且" +
"重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结" +
"构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的" +
"语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以" +
"随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术)," +
"并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列" +
"名字之后,最终,使用了提议者在喝1杯Java咖啡时无意提到的Java词语)。";
int number = 0;
//需求:提取文章中所有的英文单词
//方式一:传统方式:遍历字符串,判断每个字符的ASCII码,代码量大,效率不高
//方式二:正则表达式
//1 创建Pattern对象,模式对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile("[a-zA-Z]+");
//2 创建Matcher匹配器对象
//理解:匹配器Matcher按照pattern(模式/样式),到content文本中去匹配
//找到就返回true,否则就返回false
Matcher matcher = pattern.matcher(content);
//3 开始匹配循环
while (matcher.find()) {
//匹配内容,文本,放到 matcher.group()
System.out.println("【1.1 提取文章中所有的英文单词】找到" + (++number) + ": " + matcher.group(0));
}
}
}
1.2 入门2 提取文章中所有的数字
1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝1杯Java咖啡时无意提到的Java词语)。
Pattern pattern = Pattern.compile("[0-9]+");
【1.2 提取文章中所有数字】找到1: 1995
【1.2 提取文章中所有数字】找到2: 1
案例代码二
package com.groupies.base.day20;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** * @author GroupiesM * @date 2021/09/09 * @introduction 1.2 正则快速入门 - 提取文章中所有数字 */
public class Demo02Regexp {
public static void main(String[] args) {
String content = "1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的" +
"静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通" +
"过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的" +
"人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且" +
"重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结" +
"构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的" +
"语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以" +
"随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术)," +
"并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列" +
"名字之后,最终,使用了提议者在喝1杯Java咖啡时无意提到的Java词语)。";
int number = 0;
//1.创建Pattern对象,模式对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile("[0-9]+");
//2.创建Matcher匹配器对象
//理解:匹配器Matcher按照pattern(模式/样式),到content文本中去匹配
//找到就返回true,否则就返回false
Matcher matcher = pattern.matcher(content);
//3.开始匹配循环
while (matcher.find()) {
//匹配内容,文本,放到 matcher.group()
System.out.println("【1.2 提取文章中所有数字】找到" + (++number) + ": " + matcher.group(0));
}
}
}
1.3 入门3 提取文章中所有的英文单词和数字
1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝1杯Java咖啡时无意提到的Java词语)。
Pattern.compile("([0-9])+|([a-zA-Z]+)")
【1.3 提取文章中所有数字和英文单词】找到1: 1995
【1.3 提取文章中所有数字和英文单词】找到2: Oak
【1.3 提取文章中所有数字和英文单词】找到3: IT
【1.3 提取文章中所有数字和英文单词】找到4: Sun
【1.3 提取文章中所有数字和英文单词】找到5: Oak
【1.3 提取文章中所有数字和英文单词】找到6: Oak
【1.3 提取文章中所有数字和英文单词】找到7: Sun
【1.3 提取文章中所有数字和英文单词】找到8: Applet
【1.3 提取文章中所有数字和英文单词】找到9: Applet
【1.3 提取文章中所有数字和英文单词】找到10: Oak
【1.3 提取文章中所有数字和英文单词】找到11: Java
【1.3 提取文章中所有数字和英文单词】找到12: Oak
【1.3 提取文章中所有数字和英文单词】找到13: 1
【1.3 提取文章中所有数字和英文单词】找到14: Java
【1.3 提取文章中所有数字和英文单词】找到15: Java
案例代码三
package com.groupies.base.day20;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** * @author GroupiesM * @date 2021/09/09 * @introduction 1.3 正则快速入门 - 提取文章中所有数字和英文单词 */
public class Demo03Regexp {
public static void main(String[] args) {
String content = "1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的" +
"静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通" +
"过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的" +
"人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且" +
"重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结" +
"构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的" +
"语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以" +
"随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术)," +
"并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列" +
"名字之后,最终,使用了提议者在喝1杯Java咖啡时无意提到的Java词语)。";
int number = 0;
//1.创建Pattern对象,模式对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile("([0-9])+|([a-zA-Z]+)");
//2.创建Matcher匹配器对象
//理解:匹配器Matcher按照pattern(模式/样式),到content文本中去匹配
//找到就返回true,否则就返回false
Matcher matcher = pattern.matcher(content);
//3.开始匹配循环
while (matcher.find()) {
//匹配内容,文本,放到 matcher.group()
System.out.println("【1.3 提取文章中所有数字和英文单词】找到" + (++number) + ": " + matcher.group(0));
}
}
}
1.4 入门4 提取百度热搜标题
打开 百度搜索,右击鼠标,选择检查,使用浏览器工具查看源码
使用浏览器工具,查看百度热搜所在源码位置,复制源码(复制该内容)
Pattern pattern = Pattern.compile("<a target=\"_blank\" title=\"(\\S*)\"");
【1.4 提取百度热搜标题】找到1: ********背后的******** 【1.4 提取百度热搜标题】找到2: ***************痛哭 【1.4 提取百度热搜标题】找到3: 招聘********** 【1.4 提取百度热搜标题】找到4: 腾讯回应60岁老人凌晨三点打排位 【1.4 提取百度热搜标题】找到5: 8月猪肉价格同比下降44.9% 【1.4 提取百度热搜标题】找到6: *********有非凡表演才能 【1.4 提取百度热搜标题】找到7:
三星堆新出土完整金面具 【1.4 提取百度热搜标题】找到8: 三星堆再曝新发现 【1.4 提取百度热搜标题】找到9: ******:身负7*****20年 【1.4 提取百度热搜标题】找到10: 张家齐陈芋汐全运会再现复制粘贴 【1.4 提取百度热搜标题】找到11: ********31次提及** 【1.4 提取百度热搜标题】找到12: ****济南整形机构**** 【1.4 提取百度热搜标题】找到13: 过半学生可解开游戏防沉迷系统 【1.4 提取百度热搜标题】找到14: 中方决定向****提供价值2亿援助 【1.4 提取百度热搜标题】找到15: ****男子电梯****** 【1.4 提取百度热搜标题】找到16: 广东祖孙3人******** 【1.4 提取百度热搜标题】找到17: 南京这些文娱场所恢复开放 【1.4 提取百度热搜标题】找到18: ***政府将出现女性职位 【1.4 提取百度热搜标题】找到19: 货拉拉乘客******** 【1.4 提取百度热搜标题】找到20: ******一女子乘出租车****司机 【1.4 提取百度热搜标题】找到21: 中消协回应视频平台超前点播 【1.4 提取百度热搜标题】找到22: 李维嘉代言****** 【1.4 提取百度热搜标题】找到23: 意大利连续37场不败破巴西纪录 【1.4 提取百度热搜标题】找到24: 老人用****给孙子********* 【1.4 提取百度热搜标题】找到25: 吉林省原*********** 【1.4 提取百度热搜标题】找到26: 大表姐劳伦斯**** 【1.4 提取百度热搜标题】找到27: **************阅兵式 【1.4 提取百度热搜标题】找到28: 妈妈为女儿长高每天逼其跳绳3000个
案例代码四
package com.groupies.base.day20;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** * @author GroupiesM * @date 2021/09/09 * @introduction 1.4 正则快速入门 - 提取百度热搜标题 */
public class Demo04Regexp {
public static void main(String[] args) {
//4.提取百度热搜标题
String content = "略";
int number = 0;
//System.out.println(content);
//1 创建Pattern对象,模式对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile("<a target=\"_blank\" title=\"(\\S*)\"");
//2.创建Matcher匹配器对象
//理解:匹配器Matcher按照pattern(模式/样式),到content文本中去匹配
//找到就返回true,否则就返回false
Matcher matcher = pattern.matcher(content);
//3.开始匹配循环
while (matcher.find()) {
//匹配内容,文本,放到 matcher.group()
System.out.println("【1.4 提取百度热搜标题】找到" + (++number) + ": " + matcher.group(1));
}
}
}
1.5 入门5 找到所有的IP地址
私有地址(Private address)属于非注册地址,专门为组织机构内部使用。
以下列出留用的内部私有地址
A类 10.0.0.0--10.255.255.255
B类 172.16.0.0--172.31.255.255
C类 192.168.0.0--192.168.255.255
Pattern pattern = Pattern.compile("(\\d+\\.){3}(\\d+)");
【1.5 找到所有的IP地址】 找到1: 10.0.0.0
【1.5 找到所有的IP地址】 找到2: 10.255.255.255
【1.5 找到所有的IP地址】 找到3: 172.16.0.0
【1.5 找到所有的IP地址】 找到4: 172.31.255.255
【1.5 找到所有的IP地址】 找到5: 192.168.0.0
【1.5 找到所有的IP地址】 找到6: 192.168.255.255
案例代码五
package com.groupies.base.day20; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author GroupiesM * @date 2021/09/09 * @introduction 1.5 正则快速入门 - 找到所有的IP地址 */ public class Demo05Regexp { public static void main(String[] args) { //5.找到所有的IP地址 String content = "私有地址(Private address)属于非注册地址,专门为组织机构内部使用。\n" + "以下列出留用的内部私有地址\n" + "A类 10.0.0.0--10.255.255.255\n" + "B类 172.16.0.0--172.31.255.255\n" + "C类 192.168.0.0--192.168.255.255"; //1.创建Pattern对象,模式对象,可以理解成就是一个正则表达式对象 Pattern pattern = Pattern.compile("(\\d+\\.){3}(\\d+)"); //2.创建Matcher匹配器对象 //理解:匹配器Matcher按照pattern(模式/样式),到content文本中去匹配 //找到就返回true,否则就返回false Integer number = 0; Matcher matcher = pattern.matcher(content); //3.开始匹配循环 while (matcher.find()) { //匹配内容,文本,放到 matcher.group() System.out.println("【1.5 找到所有的IP地址】 找到" + (++number) + ": " + matcher.