明港网站建设公司,架子鼓谱那个网站做的好,北京公司网站建设价格,滨州内做网站的公司项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter27/src/com/yinhai/regexp 一、引入正则表达式
1.提取文章中所有的英文单词
2.提取文章中所有的数字
3.提取文章中所有的英文单词和数字
4.提取百度热榜标题
正则表达式是处理文本的利器… 项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter27/src/com/yinhai/regexp 一、引入正则表达式
1.提取文章中所有的英文单词
2.提取文章中所有的数字
3.提取文章中所有的英文单词和数字
4.提取百度热榜标题
正则表达式是处理文本的利器
public class Regexp {public static void main(String[] args) {//假定编写了爬虫 从百度页面得到文本String content 1995年互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的 静态网页能够“灵活”起来急需一种软件技术来开发一种程序这种程序可以通 过网络传播并且能够跨平台运行。于是世界各大IT企业为此纷纷投入了大量的 人力、物力和财力。这个时候Sun公司想起了那个被搁置起来很久的Oak并且 重新审视了那个用软件编写的试验平台由于它是按照嵌入式系统硬件平台体系结 构进行编写的所以非常小特别适用于网络上的传输系统而Oak也是一种精简的 语言程序非常小适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以 随同网页在网络上传输的AppletApplet是一种将小程序嵌入到网页中进行执行的技术 并将Oak更名为Java在申请注册商标时发现Oak已经被人使用了再想了一系列 名字之后最终使用了提议者在喝一杯Java咖啡时无意提到的Java词 语。5月23日Sun公司在Sun world会议上正式发 布Java和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软 等各大公司都纷纷停止了自己的相关开发项目竞相购买了Java使用许可证并为自己的产 品开发了相应的Java平台;//(1). 传统方法. 使用遍历方式代码量大效率不高//(2). 正则表达式技术//1. 先创建一个Pattern对象 模式对象, 可以理解成就是一个正则表达式对象Pattern pattern Pattern.compile([a-zA-Z]);//提取文章中所有的英文单词//Pattern pattern Pattern.compile([0-9]);//提取文章中所有的数字//Pattern pattern Pattern.compile(([0-9])|([a-zA-Z]));//提取文章中所有的英文单词和数字//Pattern pattern Pattern.compile(a target\_blank\ title\(\\S*)\);//提取百度热榜 标题// Pattern pattern Pattern.compile(\\d\\.\\d\\.\\d\\.\\d);//2. 创建一个匹配器对象//理解 就是 matcher 匹配器按照 pattern(模式/样式), 到 content 文本中去匹配//找到就返回true, 否则就返回falseint no 0;Matcher matcher pattern.matcher(content);//3. 可以开始循环匹配while (matcher.find()) {//匹配内容文本放到 m.group(0)System.out.println(找到: (no) matcher.group(0));}}
}1.给你一个字符串(或文章),请你找出所有四个数字连在一起的子串?
2.给你一个字符串(或文章),请你找出所有四个数字连在一起的子串并且这四个数字要满足:第一位与第四位相同,第二位与第三位相同,比如1221 , 5775
3.请验证输入的邮件是否符合电子邮件格式.
4.请验证输入的手机号是否符合手机号格式
解决之道-正则表达式
1.为了解决上述问题Java提供 了正则表达式技术专门用于处理类似文本处理问题
2.简单的说:正则表达式是对字符串执行模式匹配的技术。
3.正则表达式: regular expression RegExp
二、基本介绍
1.一个正则表达式就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用不过经过练习后就觉得这些复杂的表达式写起来还是相当简单的而且一旦你弄懂它们你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成
2.老韩这里要特别强调,正则表达式不是只有java才有实际上很多编程语言都支持正则表达式进行字符串操作!如图所示。 public class RegTheory {public static void main(String[] args) {String content 1998年12月8日第二代Java平台的企业版J2EE发布。1999年6月Sun公司发布了 第二代Java平台简称为Java2的3个版本J2MEJava2 Micro EditionJava2平台的微型 版应用于移动、无线及有限资源的环境J2SEJava 2 Standard EditionJava 2平台的 标准版应用于桌面环境J2EEJava 2Enterprise EditionJava 2平台的企业版应 用3443于基于Java的应用服务器。Java 2平台的发布是Java发展过程中最重要的一个 里程碑标志着Java的应用开始普及9889 ;//目标匹配所有四个数字//说明//1. \\d 表示一个任意的数字String regStr (\\d\\d)(\\d\\d);//2. 创建模式对象[即正则表达式对象]Pattern pattern Pattern.compile(regStr);//3. 创建匹配器//说明创建匹配器matcher 按照 正则表达式的规则 去匹配 content字符串Matcher matcher pattern.matcher(content);//4.开始匹配/**** matcher.find() 完成的任务 考虑分组* 什么是分组比如 (\d\d)(\d\d) ,正则表达式中有() 表示分组,第1个()表示第1组,第2个()表示第2组...* 1. 根据指定的规则 ,定位满足规则的子字符串(比如(19)(98))* 2. 找到后将 子字符串的开始的索引记录到 matcher对象的属性 int[] groups;* 2.1 groups[0] 0 , 把该子字符串的结束的索引1的值记录到 groups[1] 4* 2.2 记录1组()匹配到的字符串 groups[2] 0 groups[3] 2* 2.3 记录2组()匹配到的字符串 groups[4] 2 groups[5] 4* 2.4.如果有更多的分组.....* 3. 同时记录oldLast 的值为 子字符串的结束的 索引1的值即35, 即下次执行find时就从35开始匹配** matcher.group(0) 分析** 源码:* public String group(int group) {* if (first 0)* throw new IllegalStateException(No match found);* if (group 0 || group groupCount())* throw new IndexOutOfBoundsException(No group group);* if ((groups[group*2] -1) || (groups[group*21] -1))* return null;* return getSubSequence(groups[group * 2], groups[group * 2 1]).toString();* }* 1. 根据 groups[0]31 和 groups[1]35 的记录的位置从content开始截取子字符串返回* 就是 [31,35) 包含 31 但是不包含索引为 35的位置** 如果再次指向 find方法.仍然安上面分析来执行*/while (matcher.find()) {//小结//1. 如果正则表达式有() 即分组//2. 取出匹配的字符串规则如下//3. group(0) 表示匹配到的子字符串//4. group(1) 表示匹配到的子字符串的第一组字串//5. group(2) 表示匹配到的子字符串的第2组字串//6. ... 但是分组的数不能越界.System.out.println(找到: matcher.group(0));System.out.println(第1组()匹配到的值 matcher.group(1));System.out.println(第2组()匹配到的值 matcher.group(2));}}
} 三、语法
1.转义符
符号说明:在我们使用正则表达式去检索某些特殊字符的时候需要用到转义符号否则检索不到结果甚至会报错的。案例:用$去匹配abc$( 会怎样?用(去匹配abc$( 会怎样?
元字符-转义符
需要用到转义符号的字符有以下: . * () $ / \ ? [ ] ^ {}
public class RegExp02 {public static void main(String[] args) {String content abc$(a.bc(123( );//匹配( \\( String regStr \\(;//匹配. \\. String regStr \\.;//String regStr \\d\\d\\d;String regStr \\d{3};Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));}}
}2.字符匹配符
应用实例:
1. [a-z] 说明:[a-z]表示可以匹配a-z中任意一个字符,比如[a-z]、[A-Z] 去匹配a11c8会得到什么结果?
2. java正则表达式默认是区分字母大小写的如何实现不区分大小写
(?i)abc表示abc都不区分大小写
a(?i)bc表示bc不区分大小写
a((?i)b)c表示只有b不区分大小写
Pattern pat Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
[A-Z]表示可以匹配A-Z中任意一个字符。
[0-9]表示可以匹配0-9中任意一个字符。
3. [^a-z] 说明:
[^ a-z]表示可以四配不是a-z中的任意一个字符,比如
我们看看[^a-z]去匹配a11c8会得到什么结果?用[^a-z]{2}又会得到什么结果呢?
[^A-Z]表示可以匹配不是A- Z中的任意一个字符。
[^0-9]表示可以匹配不是0-9中的任意一个字符。
4. [abcd] 表示可以匹配abcd中的任意一个字符。
5.[^abcd]表示可以匹配不是abcd中的任意一个字符。当然上面的abcd你可以根据实际情况修改以适应你的需求
6. \\d 表示可以四配-9的任意-个数字,相当于[0-9]。
7. \\D 表示可以四配不是0-9中的任意一个数字,相当于[^0-9]
8. \\w 四配任意英文字符、数字和下划线相当于[a-zA-Z0-9 ]
9.\\W相当于[^a-zA-Z0-9 ]是\w刚好相反
10. \\s四配任何空白字符(空格制表符等)
11.\\S匹配任何非空白字符和\\s刚好相反
12. . 匹配出\n之外的所有字符如果要匹配 .本身则需要使用 \\. public class RegExp03 {public static void main(String[] args) {String content a11c8abc _ABCy ;//String regStr [a-z];//匹配 a-z之间任意一个字符//String regStr [A-Z];//匹配 A-Z之间任意一个字符//String regStr abc;//匹配 abc 字符串[默认区分大小写]//String regStr (?i)abc;//匹配 abc 字符串[不区分大小写]//String regStr [0-9];//匹配 0-9 之间任意一个字符//String regStr [^a-z];//匹配 不在 a-z之间任意一个字符//String regStr [^0-9];//匹配 不在 0-9之间任意一个字符//String regStr [abcd];//匹配 在 abcd中任意一个字符//String regStr \\D;//匹配 不在 0-9的任意一个字符//String regStr \\w;//匹配 大小写英文字母, 数字下划线//String regStr \\W;//匹配 等价于 [^a-zA-Z0-9_]//\\s 匹配任何空白字符(空格,制表符等)//String regStr \\s;//\\S 匹配任何非空白字符 ,和\\s刚好相反//String regStr \\S;//. 匹配出 \n 之外的所有字符,如果要匹配.本身则需要使用 \\.String regStr .;//说明//1. 当创建Pattern对象时指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写.Pattern pattern Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));}}
}
3.选择匹配符
在匹配某个字符串的时候是选择性的即:既可以匹配这个又可以四配那个这时你需 要用到选择匹配符号RegExp04.java
public class RegExp04 {public static void main(String[] args) {String content hanshunping 韩 寒冷;String regStr han|韩|寒;Pattern pattern Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));}}
}4.限定符
用于指定其前面的字符和组合项连续出现多少次 public class RegExp05 {public static void main(String[] args) {String content a211111aaaaaahello;//a{3},1{4},\\d{2}//String regStr a{3};// 表示匹配 aaa//String regStr 1{4};// 表示匹配 1111//String regStr \\d{2};// 表示匹配 两位的任意数字字符//a{3,4},1{4,5},\\d{2,5}//细节java匹配默认贪婪匹配即尽可能匹配多的//String regStr a{3,4}; //表示匹配 aaa 或者 aaaa//String regStr 1{4,5}; //表示匹配 1111 或者 11111//String regStr \\d{2,5}; //匹配2位数或者3,4,5//1//String regStr 1; //匹配一个1或者多个1//String regStr \\d; //匹配一个数字或者多个数字//1*//String regStr 1*; //匹配0个1或者多个1//演示?的使用, 遵守贪婪匹配String regStr a1?; //匹配 a 或者 a1Pattern pattern Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));}}
}
5.定位符
定位符规定要匹配的字符串出现的位置比如在字符串的开始还是在结束的位置这个 也是相当有用的 public class RegExp06 {public static void main(String[] args) {String content hanshunping sphan nnhan;//String content 123-abc;//以至少1个数字开头后接任意个小写字母的字符串//String regStr ^[0-9][a-z]*;//以至少1个数字开头, 必须以至少一个小写字母结束//String regStr ^[0-9]\\-[a-z]$;//表示匹配边界的han[这里的边界是指被匹配的字符串最后,也可以是空格的子字符串的后面]//String regStr han\\b;//和\\b的含义刚刚相反String regStr han\\B;Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));}}
}6.分组 public class RegExp07 {public static void main(String[] args) {String content hanshunping s7789 nn1189han;//下面就是非命名分组//说明// 1. matcher.group(0) 得到匹配到的字符串// 2. matcher.group(1) 得到匹配到的字符串的第1个分组内容// 3. matcher.group(2) 得到匹配到的字符串的第2个分组内容//String regStr (\\d\\d)(\\d\\d);//匹配4个数字的字符串//命名分组 即可以给分组取名String regStr (?g1\\d\\d)(?g2\\d\\d);//匹配4个数字的字符串Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));System.out.println(第1个分组内容 matcher.group(1));System.out.println(第1个分组内容[通过组名] matcher.group(g1));System.out.println(第2个分组内容 matcher.group(2));System.out.println(第2个分组内容[通过组名] matcher.group(g2));}}
}7.特别分组 给字符串String content hello韩顺平教育jack韩顺平老师韩顺平同学hello;
使用非捕获分组完成如下要求
1.找到韩顺平教育、韩顺平老师、韩顺平同学子字符串
2.找到韩顺平这个关键字,但是要求只是查找韩顺平教育和韩顺平老师中包含有的韩顺平
3.找到韩顺平这个关键字,但是要求只是查找不是(韩顺平教育和韩顺平老师)中包含有的韩顺平
1. 2. public class RegExp08 {public static void main(String[] args) {String content hello韩顺平教育 jack韩顺平老师 韩顺平同学hello韩顺平学生;// 找到 韩顺平教育 、韩顺平老师、韩顺平同学 子字符串//String regStr 韩顺平教育|韩顺平老师|韩顺平同学;//上面的写法可以等价非捕获分组, 注意不能 matcher.group(1)// String regStr 韩顺平(?:教育|老师|同学);//找到 韩顺平 这个关键字,但是要求只是查找韩顺平教育和 韩顺平老师 中包含有的韩顺平//下面也是非捕获分组不能使用 matcher.group(1)// String regStr 韩顺平(?:教育|老师);// String regStr 韩顺平(?教育|老师);//找到 韩顺平 这个关键字,但是要求只是查找 不是 (韩顺平教育 和 韩顺平老师) 中包含有的韩顺平//下面也是非捕获分组不能使用 matcher.group(1)String regStr 韩顺平(?!教育|老师);Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到: matcher.group(0));}}
}8.非贪婪匹配
当此字符紧随任何其他限定符*、、?、{n}、{n,}、{n,m}之后时匹配模式是非贪心的。非贪心的模式匹配搜索到的、尽可能短的字符串而默认的贪心的模式匹配搜索到的、尽可能长的字符串。例如在字符串oooo中o?只匹配单个o而o匹配所有o。
public class RegExp09 {public static void main(String[] args) {String content hello111111 ok;//String regStr \\d; //默认是贪婪匹配// String regStr \\d?; //非贪婪匹配String regStr \\d?; //非贪婪匹配Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到: matcher.group(0));}}
}
四、 正则表达式元字符说明表 字符 说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如n匹配字符n。\n匹配换行符。序列\\\\匹配\\\\(匹配(。 ^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性^ 还会与\n或\r之后的位置匹配。 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性$ 还会与\n或\r之前的位置匹配。 * 零次或多次匹配前面的字符或子表达式。例如zo* 匹配z和zoo。* 等效于 {0,}。 一次或多次匹配前面的字符或子表达式。例如zo与zo和zoo匹配但与z不匹配。 等效于 {1,}。 ? 零次或一次匹配前面的字符或子表达式。例如do(es)?匹配do或does中的do。? 等效于 {0,1}。 {n} n 是非负整数。正好匹配 n 次。例如o{2}与Bob中的o不匹配但与food中的两个o匹配。 {n,} n 是非负整数。至少匹配 n 次。例如o{2,}不匹配Bob中的o而匹配foooood中的所有 o。o{1,}等效于o。o{0,}等效于o*。 {n,m} m 和 n 是非负整数其中 n m。匹配至少 n 次至多 m 次。例如o{1,3}匹配fooooood中的头三个 o。o{0,1} 等效于 o?。注意您不能将空格插入逗号和数字之间。 ? 当此字符紧随任何其他限定符*、、?、{n}、{n,}、{n,m}之后时匹配模式是非贪心的。非贪心的模式匹配搜索到的、尽可能短的字符串而默认的贪心的模式匹配搜索到的、尽可能长的字符串。例如在字符串oooo中o?只匹配单个o而o匹配所有o。 . 匹配除\r\n之外的任何单个字符。若要匹配包括\r\n在内的任意字符请使用诸如[\s\S]之类的模式。 (pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果匹配集合中检索捕获的匹配。若要匹配括号字符 ( )请使用\(或者\)。 (?:pattern) 匹配 pattern 但不捕获该匹配的子表达式即它是一个非捕获匹配不存储供以后使用的匹配。这对于用or字符 (|) 组合模式部件的情况很有用。例如industr(?:y|ies) 是比 industry|industries 更经济的表达式。 (?pattern) 执行正向预测先行搜索的子表达式该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配即不能捕获供以后使用的匹配。例如Windows (?95|98|NT|2000) 匹配Windows 2000中的Windows但不匹配Windows 3.1中的Windows。预测先行不占用字符即发生匹配后下一匹配的搜索紧随上一匹配之后而不是在组成预测先行的字符后。 (?!pattern) 执行反向预测先行搜索的子表达式该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配即不能捕获供以后使用的匹配。例如Windows (?!95|98|NT|2000) 匹配Windows 3.1中的 Windows但不匹配Windows 2000中的Windows。预测先行不占用字符即发生匹配后下一匹配的搜索紧随上一匹配之后而不是在组成预测先行的字符后。 x|y 匹配 x 或 y。例如z|food 匹配z或food。(z|f)ood 匹配zood或food。 [xyz] 字符集。匹配包含的任一字符。例如[abc]匹配plain中的a。 [^xyz] 反向字符集。匹配未包含的任何字符。例如[^abc]匹配plain中plin。 [a-z] 字符范围。匹配指定范围内的任何字符。例如[a-z]匹配a到z范围内的任何小写字母。 [^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。例如[^a-z]匹配任何不在a到z范围内的任何字符。 \b 匹配一个字边界即字与空格间的位置。例如er\b匹配never中的er但不匹配verb中的er。 \B 非字边界匹配。er\B匹配verb中的er但不匹配never中的er。 \cx 匹配 x 指示的控制字符。例如\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样则假定 c 就是c字符本身。 \d 数字字符匹配。等效于 [0-9]。 \D 非数字字符匹配。等效于 [^0-9]。 \f 换页符匹配。等效于 \x0c 和 \cL。 \n 换行符匹配。等效于 \x0a 和 \cJ。 \r 匹配一个回车符。等效于 \x0d 和 \cM。 \s 匹配任何空白字符包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 \S 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 \t 制表符匹配。与 \x09 和 \cI 等效。 \v 垂直制表符匹配。与 \x0b 和 \cK 等效。 \w 匹配任何字类字符包括下划线。与[A-Za-z0-9_]等效。 \W 与任何非单词字符匹配。与[^A-Za-z0-9_]等效。 \xn 匹配 n此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如\x41匹配A。\x041与\x041等效。允许在正则表达式中使用 ASCII 代码。 \num 匹配 num此处的 num 是一个正整数。到捕获匹配的反向引用。例如(.)\1匹配两个连续的相同字符。 \n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式那么 n 是反向引用。否则如果 n 是八进制数 (0-7)那么 n 是八进制转义码。 \nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获则 n 是反向引用后面跟有字符 m。如果两种前面的情况都不存在则 \nm 匹配八进制值 nm其中 n 和 m 是八进制数字 (0-7)。 \nml 当 n 是八进制数 (0-3)m 和 l 是八进制数 (0-7) 时匹配八进制转义码 nml。 \un 匹配 n其中 n 是以四位十六进制数表示的 Unicode 字符。例如\u00A9 匹配版权符号 (©)。 五、案例
1.汉字 2.邮政编码 要求:是1-9开头的一个六位数.比如: 123890
3.QQ号码 要求:是1-9开头的一个(5位数10位数)比如: 12389 , 1345687187698765
4.手机号码 要求必须以13,14,15,18开头的11位数比如13588889999
public class RegExp10 {public static void main(String[] args) {//汉字//String content 韩顺平教育;// String regStr ^[\u0391-\uffe5]$;//邮政编码//要求:是1-9开头的一个六位数.比如: 123890// String content 111140;//要求是1-9开头的六位数 比如123890// String regStr ^[1-9]\\d{5}$;//QQ号码//要求:是1-9开头的一个(5位数10位数)比如: 12389 , 1345687187698765// String content 111140;// String regStr ^[1-9]\\d{4,9}$;//手机号码//要求必须以13,14,15,18开头的11位数比如13588889999String content 13588889999;String regStr ^1[3|4|5|8]\\d{9}$;Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);if(matcher.find()){System.out.println(满足格式);}else{System.out.println(不满足格式);}}
}
5. URL: 如: https://www.bilibili.com/video/BV1fh411y7R8?p893spm_id_frompageDrivervd_source6af85ae96c487fe7bd51b3d5644ebafc public class RegExp11 {public static void main(String[] args) {String content https://www.bilibili.com/video/BV1fh411y7R8?p893spm_id_frompageDrivervd_source6af85ae96c487fe7bd51b3d5644ebafc;/*1.先确定url开始的部分https:// | http://2.然后匹配www.bilibili.com - ([\w-]\.)[\w-]3.然后匹配/video/BV1fh411y7R8?p893spm_id_frompage... - (\/[\w-?/%.#]*)?*///中括号内的?.都是表示字符的?.并不带有其他含义String regStr ^((https|https)://)([\\w-]\\.)[\\w-](\\/[\\w-?/%.#]*)?$;Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);if(matcher.find()){System.out.println(格式正确);}else{System.out.println(格式错误);}}
}
六、正则表达式三个常用类
正则表达式三个常用类
java.util.regex包主要包括以下三个类Pattern类、Matcher 类和PatternSyntaxException
Pattern 类 pattern对象是一个正则表达式对象。 Pattern 类没有公共构造方法。要创建一个Pattern对象调用其公共静态方法它返回一个Pattern对象。该方法接受一个正则表达式作为它的第个参数比如: Pattern r Pattern.compile(pattern);
Matcher类 Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern 类一样Matcher 也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象
PatternSyntaxException PatternSyntaxException是一个非强制异常类它表示个正则表达式模式中的语法错误。
1.Matcher类
public class PatternMethod {public static void main(String[] args) {String content hello abc hello, 韩顺平教育;//String regStr hello;String regStr hello.*;boolean matches Pattern.matches(regStr, content);System.out.println(整体匹配 matches);}
}public class MatcherMethod {public static void main(String[] args) {String content hello edu jack hspedutom hello smith hello hspedu hspedu;String regStr hello;Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println();System.out.println(matcher.start());System.out.println(matcher.end());System.out.println(找到: content.substring(matcher.start(), matcher.end()));}//整体匹配方法常用于去校验某个字符串是否满足某个规则System.out.println(整体匹配 matcher.matches());//完成如果content 有 hspedu 替换成 韩顺平教育regStr hspedu;pattern Pattern.compile(regStr);matcher pattern.matcher(content);//注意返回的字符串才是替换后的字符串 原来的 content 不变化String newContent matcher.replaceAll(韩顺平教育);System.out.println(newContent newContent);System.out.println(content content);}
}七、分组、捕获 、反向引用
给你一段文本请你找出所有四个数字连在一起的子串 并且这四个数字要满足(1)第1位与第4位相同(2)第2位与第3位相同比如12215775
1.介绍
要解决前面的问题我们需要了解正则表达式的几个概念:
1. 分组我们可以用圆括号组成一个比较复杂的匹配模式那么一个圆括号的部分我们可 以看作是一个子表达式 / 一个分组。
2.捕获把正则表达式中子表达式 / 分组四配的内容保存到内存中以数字编号或显式命名的组里方便后面引用从左向右以分组的左括号为标志第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式
3.反向引用圆括号的内容被捕获后可以在这个括号后被使用从而写出一个比较实用的匹配模式这个我们称为反向引用这种引用既可以是在正则表达式内部也可以是在正则表达式外部内部反向引用 \\分组号,外部反向引用$分组号
2.案例
1.要匹配两个连续的相同数字: (\\d)\\1
2.要匹配五个连续的相同数字:(\\d)\\1\\1\\1\\1
3.要匹配个位与干位相同十位与百位相同的数5225, 1551 (\\d)(\\d)\\2\\1
public class RegExp12 {public static void main(String[] args) {String content h1234el9876lo33333 j12324-333999111a1551ck14 tom11 jack22 yyy12345 xxx;//要匹配两个连续的相同数字 : (\\d)\\1//String regStr (\\d)\\1;//要匹配五个连续的相同数字 (\\d)\\1{4}//String regStr (\\d)\\1{4};//要匹配个位与千位相同十位与百位相同的数 5225 , 1551 (\\d)(\\d)\\2\\1//String regStr (\\d)(\\d)\\2\\1;/*** 请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,* 要求满足前面是一个五位数,然后一个-号,然后是一个九位数,连续的每三位要相同*/String regStr \\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2};Pattern pattern Pattern.compile(regStr);Matcher matcher pattern.matcher(content);while (matcher.find()) {System.out.println(找到 matcher.group(0));}}
}3.经典结巴程序
//0898_韩顺平Java_结巴去重案例_哔哩哔哩_bilibili
有点不了解底层原理 可以再搜一下 先过一遍
public class RegExp13 {public static void main(String[] args) {String content 我....我要....学学学学....编程java!;//1. 去掉所有的.Pattern pattern Pattern.compile(\\.);Matcher matcher pattern.matcher(content);content matcher.replaceAll();// System.out.println(content content);//2. 去掉重复的字 我我要学学学学编程java!// 思路//(1) 使用 (.)\\1//(2) 使用 反向引用$1 来替换匹配到的内容// 注意因为正则表达式变化所以需要重置 matcher
// pattern Pattern.compile((.)\\1);//分组的捕获内容记录到$1
// matcher pattern.matcher(content);
// while (matcher.find()) {
// System.out.println(找到 matcher.group(0));
// }
//
// //使用 反向引用$1 来替换匹配到的内容
// content matcher.replaceAll($1);
// System.out.println(content content);//3. 使用一条语句 去掉重复的字 我我要学学学学编程java!content Pattern.compile((.)\\1).matcher(content).replaceAll($1);System.out.println(content content);}
}
八、在String类中使用正则表达式
public class StringReg {public static void main(String[] args) {String content 2000年5月JDK1.3、JDK1.4和J2SE1.3相继发布几周后其 获得了Apple公司Mac OS X的工业标准的支持。2001年9月24日J2EE1.3发 布。 2002年2月26日J2SE1.4发布。自此Java的计算能力有了大幅提升;//使用正则表达式方式将 JDK1.3 和 JDK1.4 替换成JDKcontent content.replaceAll(JDK1\\.3|JDK1\\.4, JDK);System.out.println(content);//要求 验证一个 手机号 要求必须是以138 139 开头的content 13888889999;if (content.matches(1(38|39)\\d{8})) {System.out.println(验证成功);} else {System.out.println(验证失败);}//要求按照 # 或者 - 或者 ~ 或者 数字 来分割System.out.println();content hello#abc-jack12smith~北京;String[] split content.split(#|-|~|\\d);for (String s : split) {System.out.println(s);}}
}