第十六章《正则表达式》第4节:Matcher类
16.3小节所介绍的Pattern类代表了正则表达式,它的功能不是很强,如果程序员想用正则表达式完成替换等更复杂的操作,必须使Matcher类。Matcher类也位于java.util.regex包下,使用这个类时需要用import关键字进行引入。
Java语言的官方文档把Matcher类解释为执行匹配操作的引擎,但这个解释过于抽象,不好理解。为方便读者理解,可以把Matcher类比喻成一个智能机器人,这个机器人手里拿着一个正则表达式,脚下是一个字符串。它拿着正则表达式,在脚下字符串上来回的移动,寻找能够与表达式相匹配的目标字符串。当机器人找到了目标字符串以后,可以做很多操作,例如替换操作等。需要说明:智能机器人手中拿着的正则表达式实际上就是一个Pattern类的对象,而它脚下是字符串既可以是String类对象,也可以是StringBuffer类和StringBuilder类对象。本小节将详细讲解Matcher类的使用。
16.4.1 Matcher类的匹配方法
Matcher类的构造方法不是公开的,所以程序员不能直接通过new关键字创建它的对象。创建Matcher类对象需要调用Pattern对象的matcher()方法来完成,例如:
String str = "1a";
Pattern p = Pattern.compile("\\d\\w");
Matcher m = p.matcher(str);
从以上代码可以看到:matcher()方法的参数是一个字符串,这个字符串就是智能机器人脚下的那个字符串,所创建出的Mather类对象就会从这个字符串中完成搜索,而Pattern对象p就是智能机器人手中拿着的那个正则表达式。
Matcher类中提供了一些用于匹配目标字符串的方法,如表16-6所示。
表16-6 Matcher类的匹配方法
方法 |
功能 |
boolean matches() |
测试字符串整体能否与正则表达式相匹配 |
boolean lookingAt() |
测试字符串是不是以正则表达式所定义的结构开头 |
boolean find() |
搜索下一个目标字符串,如能找到返回true,否则返回false |
public boolean find(int start) |
从索引为start的位置开始搜索目标字符串 |
public String group() |
获得当前匹配项整体,必须在已经找到目标字符串的情况下执行此方法才有意义,否则会抛出异常 |
String group(int group) |
获得当前匹配项中编号为group的组中的内容,必须在已经找到目标字符串的情况下执行此方法才有意义,否则会抛出异常 |
String start() |
获得当前匹配项内容在整体字符串中的起始位置 |
String start(int group) |
获得当前匹配项中第group组的内容在整体字符串中的起始位置 |
String end() |
获得当前匹配项的内容最后一个字符在整体字符串中的位置+1 |
String end(int group) |
获得当前匹配项中第group组的内容在整体字符串中的位置+1 |
int groupCount() |
获得正则表达式中分组的个数 |
在表16-6所列出的这些方法中,最核心的就是find()方法。如果字符串中存在能够与正则表达式匹配的目标字符串,那么find()方法能够让智能机器人移动到这个目标字符串上,只有移动到目标字符串上,才能调用group()、start()、end()这些方法来获得这个目标字符串以及它的各项数据。而如果希望智能机器人回到初始位置,只要调用Matcher类的reset()方法就能完成。
下面的【例16_16】展示了Matcher类匹配方法的使用。
【例16_16 Matcher类的匹配方法】
Exam16_16.java
import java.util.regex.*;
public class Exam16_16 {public static void main(String[] args) {String str = "abbaqwecddc";//str就是机器人脚下的字符串String reg = "(.)(.)\\2\\1";//表示4个字符且左右对称的结构Pattern p = Pattern.compile(reg);//p就是机器人手里的正则表达式Matcher m = p.matcher(str);//m就是智能机器人System.out.println("正则表达式中分组的个数:"+m.groupCount());System.out.println("str整体是否匹配正则表达:"+m.matches());int i=1;while (m.find()){//搜索能够匹配的目标字符串System.out.println("找到了第"+i+"个目标字符串!");System.out.println("目标字符串是:"+m.group());System.out.println("目标字符串中第一组的内容是:"+m.group(1));System.out.println("目标字符串在str中的位置:"+m.start());System.out.println("目标字符串最后一个字符在str中的位置"+(m.end()-1));i++;}}
}
【例16_16】的运行结果如图16-16所示。
图16-16【例16_16】运行结果
从图16-16可以看出:只有find()方法找到了符合匹配条件的目标字符串,才能调用group()、start()、end()这些方法来获得这个目标字符串以及它的各项数据。
16.4.2 Matcher类的替换方法
Matcher类不仅仅能够在字符串中找到匹配项,还能够把这些匹配项替换成某个字符串,完成替换操作需要用到Matcher类的替换方法,这些替换方法如表16-7所示。
表16-7 Matcher类的替换方法
方法 |
功能 |
String replaceFirst(String rep) |
把字符串中第一个匹配项替换为rep,并返回替换后的字符串 |
String replaceAll (String rep) |
把字符串中所有匹配项替换为rep,并返回替换后的字符串 |
Matcher appendReplacement (StringBuffer sb, String rep) |
把当前匹配项替换为rep,之后把当前匹配项替换为rep,并且把rep及其前面的内容统统添加到sb的末尾,之前添加过的内容不会重复添加 |
StringBuffer appendTail(StringBuffer sb) |
把最后一次被替换的目标字符串后面的部分添加到sb中。 |
Matcher类的这些替换方法中,appendReplacement()方法也需要先调用find()方法找到一个匹配项,然后才能执行。下面的【例16_17】展示了replaceFirst()和replaceAll ()方法的作用和效果。
【例16_17 Matcher类的替换方法1】
Exam16_17.java
import java.util.regex.*;
public class Exam16_17 {public static void main(String[] args) {String str = "xyzabbauvwcddc";String reg = "(.)(.)\\2\\1";//正则表达式定义了4字符对称结构Pattern p = Pattern.compile(reg);Matcher m = p.matcher(str);//替换第一个对称字符串String replace1 = m.replaceFirst("*");System.out.println(replace1);//替换所有的对称字符串String replace2 = m.replaceAll("*");System.out.println(replace2);}
}
【例16_17】的运行结果如图16-17所示。
图16-17【例16_17】运行结果
replaceAll ()方法只能把满足匹配条件的目标字符串全部进行替换,如果希望把第1、3、5、7...等奇数号的目标字符串进行替换,就必须使用appendReplacement()和appendTail()方法实现,下面的【例16_18】展示了appendReplacement()和appendTail()方法的作用和效果。
【例16_18 Matcher类的替换方法2】
Exam16_18.java
import java.util.regex.*;
public class Exam16_18 {public static void main(String[] args) {String str = "123456789xyz";String reg = "\\d";Pattern p = Pattern.compile(reg);Matcher m = p.matcher(str);int i=0;StringBuffer sb = new StringBuffer();while (m.find()){//持续搜索目标字符串if(++i%2==1){//仅有奇数号的目标字符串被替换//替换后把前面的部分加入sb末尾m.appendReplacement(sb,"*");}}//把最后一次被替换的目标字符串后面的部分添加到sb中m.appendTail(sb);System.out.println(sb);}
}
【例16_18】的运行结果如图16-18所示。
图16-18【例16_18】运行结果
从图16-18可以看出:只有奇数号的目标字符串被替换为*。
16.4.3设置Matcher搜索范围
Matcher的find()方法能够从整个字符串中进行搜索,如果希望对find()方法设置一个搜索范围,可以调用Matcher类的region()方法实现。region()方法的原型如下:
Matcher region(int start, int end)
region()方法的有两个参数,分别是start和end,它们表示要在下标为[start,end)的范围内进行搜索。需要注意:region()方法所设置的搜索范围仅能影响到find()方法,不会影响到replaceAll()方法的执行效果。下面的【例16_19】展示了region()方法的作用和效果。
【例16_19 设置搜索范围】
Exam16_19.java
import java.util.regex.*;
public class Exam16_19 {public static void main(String[] args) {String str = "0123456789";Pattern p = Pattern.compile("\\d");//目标字符串是数字Matcher m = p.matcher(str);m.region(2,6);System.out.print("find()方法找到的所有目标字符:");while (m.find()){//持续搜索目标字符串System.out.print(m.group());//打印搜索到的目标字符串}System.out.println();//换行String replace = m.replaceAll("*");System.out.println("把str中所有数字替换为*:"+replace);}
}
【例16_19】的运行结果如图16-19所示。
图16-19【例16_19】运行结果
从图16-19可以看出:虽然设置了搜索范围,但并不影响replaceAll()方法把全部数字替换为“*”。
除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!
第十六章《正则表达式》第4节:Matcher类相关推荐
- pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...
1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...
- 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...
1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...
- 《深入理解 Spring Cloud 与微服务构建》第十六章 Spring Boot Security 详解
<深入理解 Spring Cloud 与微服务构建>第十六章 Spring Boot Security 详解 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...
- 【正点原子FPGA连载】第三十六章 基于OV5640的PL以太网视频传输实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- 【正点原子FPGA连载】第十六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- 【正点原子STM32连载】第四十六章 FATFS实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- 【正点原子MP157连载】第十六章 基本定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 光盘显示0字节可用_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验
1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...
- 第四十六章 使用 ^SystemPerformance 监视性能 - 生成 ^SystemPerformance 性能报告
文章目录 第四十六章 使用 ^SystemPerformance 监视性能 - 生成 ^SystemPerformance 性能报告 生成 `^SystemPerformance` 性能报告 使用任务 ...
- 【Linux命令】《鸟哥Linux基础》第十六章 进程管理与SELinux初探
第十六章 进程管理与SELinux初探 16.1 什么是进程(process) Linux下的所有命令与你能够执行的操作 ===>都与权限有关 如何判断权限? 账号管理中的UID.GID:文件属 ...
最新文章
- switchyomega规则列表备份_求人不如求己,自己动手写一个CSDN博客备份小工具?...
- C#中调用C++ 动态链接库 dll 的方法
- linux进程与它的堆栈空间
- mysql全局唯一id_Mysql实现全局唯一ID
- 《Java程序性能优化》之设计优化
- 解题报告 Number
- 前端学习(2229):react条件渲染实现登录
- Linux给Java程序设置端口_扫描服务端口的Java程序
- syslog 向内存中缓存_动画:深入浅出从根上理解 HTTP 缓存机制及原理!
- 这么大一座Azure“图书馆”,你竟没有发现…
- [Python] 函数来判断一个对象是否是一个已知的类型:isinstance(object, classinfo)
- 怎样用java抽签小程序,可以作弊的抽签小程序,急求java抽签小程序
- shp文件根据属性导出若干单独shp
- word无法读取此文件,文档可能已损坏_可能的补救方法
- python中compile的作用_Python compile函数有什么用?
- html p标签 删除线,strike html 删除线 贯穿线标签
- 树莓派启动自动连接WiFi
- 中国压电材料取得突破性进展,未来B超机可折叠弯曲
- Swift macOS NSTextField 响应键盘按键 Enter 回车键,或者其它按键
- mysql查询学科_查询出各个学科的前3名的同学信息的Sql
热门文章
- Hamburgers(二分+贪心)(又名: 比奇堡的汉堡节)
- mysql 查看 dml,MySQL系列-DML语句
- 织梦后台上传图集显示302错误解决方法
- 数据结构之线性表的查找
- 高薪程序员面试题精讲系列77之如何防止前端页面重复提交请求?
- 华为、腾讯、淘宝面试流程+面试技术题分析,速看...
- 去除隐藏小程序右侧滚动条的两种方法
- iOS视频直播:高仿喵播APP
- 学车手记之二 练习倒桩(zt)
- 软件项目管理 7.4.2.进度计划编排-关键路径法