Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例。
Matcher类提供Matcher.matches()、Matcher.lookingAt()、Matcher.find()三个匹配操作方法,它们都返回boolean类型,当匹配到时返回true,没匹配到则返回false。
- matches()
对整个字符串进行匹配,只有整个字符串都匹配了才返回true,匹配不上和部分匹配都返回false
- lookingAt()
对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
- find()
对字符串进行匹配,匹配到的字符串可以在任何位置
示例:
public static void main(String[] args) {
Pattern p = Pattern.compile(“\d+”);
Matcher m = p.matcher(“22aa33”);
System.out.println(m.matches());// false,因为aa不能被\d+匹配,导致整个字符串匹配未成功
m = p.matcher(“2233”);
System.out.println(m.matches());// true,因为\d+匹配到了整个字符串
}
示例:
public static void main(String[] args) {
Pattern p = Pattern.compile(“\d+”);
Matcher m = p.matcher(“22bb33”);
System.out.println(m.find());// true
m = p.matcher(“aa2233”);
System.out.println(m.find());// true
m = p.matcher(“aa2233bb”);
System.out.println(m.find());// true
}
当使用matches()、lookingAt()、find()执行匹配操作后,就可以利用以下三个方法得到更详细的信息:
-
start():返回匹配到的子字符串的第一个字符在字符串中的索引位置,从0开始
-
end():返回匹配到的子字符串的最后一个字符在字符串中的索引位置的下一位置,从0开始
-
group():返回匹配到的子字符串
示例:
public static void main(String[] args) {
Pattern p = Pattern.compile(“\d+”);
System.out.println(“find 方法”);
Matcher m = p.matcher(“aaa2233bb”);
System.out.println(m.find());// true 匹配2223
System.out.println(m.start());// 3
System.out.println(m.end());// 7 返回的是2223后的索引号
System.out.println(m.group());// 2223
System.out.println(“lookingAt 方法”);
m = p.matcher(“2233bb”);
System.out.println(m.lookingAt()); // true 匹配2223
// 由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0
System.out.println(m.start()); // 0,
System.out.println(m.end()); // 4
System.out.println(m.group()); // 2223
System.out.println(“matches 方法”);
m = p.matcher(“2233bb”);
System.out.println(m.matches()); // false,所以后边的执行会报错
System.out.println(m.start());
System.out.println(m.end());
System.out.println(m.group());
}
Matcher类同时提供了replaceAll() 、replaceFirst()、appendReplacement()、appendTail()四个将匹配子串替换成指定字符串的方法,其中:
- appendReplacement(StringBuffer sb, String replacement)
将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里
- appendTail(StringBuffer sb)
将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。
示例:
public static void main(String[] args) {
// 生成 Pattern 对象并且编译一个简单的正则表达式"cat"
Pattern p = Pattern.compile(“cat”);
// 用 Pattern 类的 matcher() 方法生成一个 Matcher 对象
String str = “fatcatfatcatha”;
Matcher m = p.matcher(str);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,“dog”);
}
m.appendTail(sb);
System.out.println(“sb:”+sb); //fatdogfatdogha
}
说明:
上面代码while循环,循环两次,第一次循环之后sb=fatdob
;第二次循环之后sb=fatdogfatdog
,然后跳出循环,执行 m.appendTail(sb);
时将str中剩余的内容 ha追加到sb中,最后sb的值为fatdogfatdogha
示例:用java正则表达式检测字符串中含有某字符方法:
public static void main(String[] args) {
String str=“Hello World”; //待判断的字符串
String reg=“.or.”; //判断字符串中是否含有or
System.out.println(str.matches(reg)); //调用的是字符串类的matches()方法
}
示例:通过Matcher类的find和group方法依次从目标字符串中取出特定子串
public static void main(String[] args) {
Matcher matcher = Pattern.compile(“\w+”).matcher(“good good study day day up”);
while (matcher.find()){
System.out.print(matcher.group() + " ★ ");
}
System.out.println();
int i = 0; //从第0个位置开始匹配
while (matcher.find(i)) {
System.out.print(matcher.group() + " ★ ");
i = matcher.end(); //匹配到的最后一个元素的下一个位置
}
i = 3;
System.out.println();
// 查找从第3个字符开始的,长度大于等于5的单词
matcher = Pattern.compile(“\w{3,}”).matcher(“we love china”);
while (matcher.find(i)) {
System.out.println(matcher.group() + " " + matcher.start() + " "
- matcher.end());
i = matcher.end();
}
}
运行程序,结果如下图所示:
示例:验证是否是邮件
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
外链图片转存中…(img-9vOTg36g-1715795052143)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!