首页 > 其他分享 >第十六章《正则表达式》第4节:Matcher类

第十六章《正则表达式》第4节:Matcher类

时间:2023-01-02 21:33:55浏览次数:58  
标签:第十六章 String 16 正则表达式 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所示。​

第十六章《正则表达式》第4节:Matcher类_正则表达式

图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所示。​

第十六章《正则表达式》第4节:Matcher类_Pattern_02

图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所示。​

第十六章《正则表达式》第4节:Matcher类_Java_03

图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所示。​

第十六章《正则表达式》第4节:Matcher类_正则表达式_04

图16-19【例16_19】运行结果​

从图16-19可以看出:虽然设置了搜索范围,但并不影响replaceAll()方法把全部数字替换为“*”。​

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。

标签:第十六章,String,16,正则表达式,Matcher,字符串,方法,替换
From: https://blog.51cto.com/mugexuetang/5984149

相关文章

  • 解放生产力!一文教你快速入门正则表达式
    一、概述正则表达式一般用于文本内容的查找和替换,在日常工作中还可用来校验用户的输入是否符合自定义的规则。正则表达式是匹配模式,要么匹配字符,要么匹配位置。正则表达......
  • 快来领取你的JavaScript正则表达式速查表
    如果我们想对字符串进行相关(增、删、改、查、检索)操作,就可以用接下来的正则表达式实现 什么是正则表达式正则表达式是用于匹配字符串中字符组合的模式正则表达式通......
  • 正则表达式基础语法
     1、预定义的字符类(默认匹配一个字符)元字符解释.任何字符\d一个数字:[0-9]\D非数字:[^0-9]\s一个空白字符:[\t\n\x0B\f\r]\S非空白字符:[^\s]\w......
  • Linux&shell通过正则表达式查找文件练习
    linux&shell编程中通过正则表达式来匹配查找文件极大的提高查找效率。首先,解释一下下边出现的命令。linux部分:ls:查看文件夹内的命令。|:管道。grep:搜索后边匹配的字符......
  • java用正则表达式脱敏手机号
    一种正则形式:在Java开发中有时候需要对敏感字段数据脱敏,废话不多说,直接上代码。       /**        *脱敏手机号        *        *@......
  • Js利用正则表达式去除字符串的中括号
    原文链接:点我  //功能:1)去除字符串前后所有空格   //     2)去除字符串中所有空格(包括中间空格,需要设置第2个参数为:g)   functionTrim(str,is_g......
  • 如何在表格中写正则表达式来提取电话号码?
    正则表达式,是描述匹配模式(pattern)的文本字符串,用于搜索和匹配字符串集。简单来说,就是可以通过从一堆字符串里,搜索提取自己想要的内容。Excel网络函数库帮助使用者们在Ex......
  • 正则表达式 元字符列表
    正则表达式\w\s\d\b.匹配除换行符以外的任意字符 \w匹配字母或数字或下划线或汉字等价于'[A-Za-z0-9_]'。 \s匹配任意的空白符 \d匹配数字 \b匹配单词的开......
  • 微信小程序中data里的正则表达式丢失问题
    最近在开发微信小程序的时候在data里面定义了正则表达式,结果在读取的时候发现正则表达式丢了。只返回了一个空的对象Page({data:{reg:/^1\d{10}$/g},onLo......
  • 对于正则表达式的妙用
     转载:好多关于正则表达式的都是介绍语法的,这个告诉你正则表达式有什么用处。对于正则表达式,在很多人脑海中就是一堆完全不知所云的特殊符号,看了第一眼,就不想再看第二眼,学......