Pattern和Matcher
java.util.regex 包(处理正则表达式) 提供了两个用来处理正则表达式的工具类:Pattern和Matcher。Pattern用于建立待匹配的正则表达式模型,Matcher用于在匹配完成后对匹配结果进行相应操作。
一.Pattern
◆ 1.1 Pattern.pattern()
返回正则表达式的字符串形式
Pattern p=Pattern.compile("\\w+"); p.pattern();//返回 \w+
◆ 1.2 Pattern.split(CharSequence input)
该方法用于分割字符串,并返回一个String[].
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com");
运行结果:
str[0]="我的QQ是:" str[1]="我的电话是:" str[2]="我的邮箱是:aaa@aaa.com"
◆ 1.3 Pattern.matchers(String regex,CharSequence input)
该方法是一个静态方法,用于快速匹配字符串,该方法将会匹配全部字符串
Pattern.matches("\\d+","2223");//返回true Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到 Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到
二.Matcher
Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false。
◆ 2.1 Matcher.matches()
matches()方法匹配的是整个字符串
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功. Matcher m2=p.matcher("2223"); m2.matches();//返回true,因为\d+匹配到了整个字符串
◆ 2.2 Matcher.lookingAt()
lookingAt()对最前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true.
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.lookingAt();//返回true,因为\d+匹配到了前面的22 Matcher m2=p.matcher("aa2223"); m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
◆ 2.3 Matcher.find()
对指定的字符串进行匹配,匹配到的字符串可以在任意位置。
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.find();//返回true Matcher m2=p.matcher("aa2223"); m2.find();//返回true Matcher m3=p.matcher("aa2223bb"); m3.find();//返回true Matcher m4=p.matcher("aabb"); m4.find();//返回false
◆ 2.4 Matcher.start()
返回匹配到的子字符串在字符串中的起始位置。
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("aaa2223bb"); m.find();//匹配2223 m.start();//返回3
◆ 2.5 Matcher.end()
返回匹配到的子字符串的最后一个字符的下一个索引值。注意!是下一个索引值,而不是该子字符串中最后一个字符的索引值!
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("aaa2223bb"); m.find();//匹配2223 m.end();//返回7,返回的是2223后的索引号
◆ 2.6 Matcher.group()
group即返回匹配到的字符串。
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("aaa2223bb"); m.find();//匹配2223 m.group();//返回2223
◆ 2.6 Matcher.start(int, i), Matcher.end(int, i), Matcher.group(int, i), Matcher.groupCount()
前三个API主要用于分组操作,取出第i组数据的索引值,groupCount()则用来返回一共匹配到多少组。
Pattern p=Pattern.compile("([a-z]+)(\\d+)"); //()表示分组,意义是括号内是一个整体 Matcher m=p.matcher("aaa2223bb"); m.find(); //匹配aaa2223 m.groupCount(); //返回2,因为有2组 m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号 m.start(2); //返回3 m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置. m.end(2); //返回7 m.group(1); //返回aaa,返回第一组匹配到的子字符串 m.group(2); //返回2223,返回第二组匹配到的子字符串
三. 使用正则表达式提取一段文本中的数字
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com"); while(m.find()) { System.out.println(m.group()); }
运行结果:
456456
0532214
123
如果将while循环替换成
while(m.find()) { System.out.println(m.group()); System.out.print("start:"+m.start()); System.out.println(" end:"+m.end()); }
则输出:
456456
start:6 end:12
0532214
start:19 end:26
123
start:36 end:39
注意!只有当匹配成功后,才可以使用start(), end(), group()方法,否则会抛出java.lang.IllegalStateException。也就是说,当matchers(), lookingAt(), find() 其中一个方法返回true时,才可以使用start(),end(),group()方法。
<完>
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库