java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开java API文档,当介绍到哪个方法时,查看java API中的方法说明,效果会更佳).

Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过 Pattern.complie(String regex) 简单工厂方法创建一个正则表达式。 
Java代码示例:

Pattern p=Pattern.compile("\\w+");
p.pattern();//返回 \w+ 

compile(String regex) 将正则表达式编译到Pattern中。该方法是个静态方法;

pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数 ;

1.Pattern.split(CharSequence input)

Pattern有一个split(CharSequence input)方法,用于分隔字符串,并返回一个String[],我猜String.split(String regex)就是通过Pattern.split(CharSequence input)来实现的;
Java代码示例:

Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的姓名是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com"); 

结果:str[0]="我的姓名是:" str[1]="我的电话是:" str[2]="我的邮箱是:aaa@aaa.com"

2.Pattern.matcher(String regex,CharSequence input)

Pattern.matcher(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串;
Java代码示例:

Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到 

3.Pattern.matcher(CharSequence input)

Pattern.matcher(CharSequence input)返回一个Matcher对象. 
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例. 
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 
Java代码示例:

Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23"); m.pattern();//返回p 也就是返回该Matcher对象是由哪个Pattern对象的创建的 

4.Matcher.matches()

Matcher类提供三个匹配操作方法(Matcher.matches()/ Matcher.lookingAt()/ Matcher.find() ),三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false 
matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true 
Java代码示例:

Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2=p.matcher("2223");
m2.matches();//返回true,因为\d+匹配到了整个字符串 

我们现在回头看一下Pattern.matcher(String regex,CharSequence input),它与下面这段代码等价 Pattern.compile(regex).matcher(input).matches()

5.Matcher.lookingAt()

lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true 
Java代码示例:

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 

6.Matcher.find()

find()对字符串进行匹配,匹配到的字符串可以在任何位置. 
Java代码示例:

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 

7.Mathcer.start()/ Matcher.end()/ Matcher.group()

当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以下三个方法得到更详细的信息.

start():返回匹配到的子字符串在字符串中的索引位置. 
end():返回匹配到的子字符串的最后一个字符在字符串中的索引位置. 
group():返回匹配到的子字符串

Java代码示例:

Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.start();//返回3
m.end();//返回7,返回的是2223后的索引号
m.group();//返回2223 

Mathcer m2=p.matcher("2223bb");
m2.lookingAt();   //匹配2223
m2.start();   //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0
m2.end();   //返回4
m2.group();   //返回2223 

Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出错,因为不匹配返回false
m3.matches();   //匹配整个字符串
m3.start();   //返回0
m3.end();   //返回3,原因相信大家也清楚了,因为matches()需要匹配所有字符串
m3.group();   //返回2223

start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,Mathcer类还有一个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,返回第二组匹配到的子字符串 

例子:

  例如有一段文本(我的QQ是:3609789 我的电话是:0532214 我的邮箱是:aaa123@aaa.com),里面有很多数字,而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单.

Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("我的QQ是:3609789 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");
while(m.find()) { System.out.println(m.group());
} 

输出:
  3609789
  0532214 
  123

总结:

现在应该知道,每次执行匹配操作后start(),end(),group()三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.

只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.

Pattern与Matcher一起合作,Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.。单独用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一种最基础最简单的匹配。

Pattern.compile(regex).matcher(input).matches()

转载于:https://www.cnblogs.com/tongxuping/p/7832895.html

java.util.regex包下的Pattern和Matcher详解(正则匹配)相关推荐

  1. java Pattern和Matcher详解

    结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String ...

  2. java concurrent 框架,java.util.concurrent 包下的 Synchronizer 框架

    看完书 java concurrency in practice 当然是想找点啥好玩的东东玩玩. 当看到了Doug Lee 的论文 << The java.util.concurrent ...

  3. Function接口 – Java8中java.util.function包下的函数式接口

    作者:   Mohamed Sanaulla  译者: 李璟(jlee381344197@gmail.com) 早先我写了一篇<函数式接口>,探讨了Java8中函数式接口的用法.如果你正在 ...

  4. java.util 常见_Java基础知识-java.util.concurrent包下常见类的使用

    一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public classCon ...

  5. Java工具包工具类,java.util.concurrent 包下工具类的使用

    CountDownLacth 的使用 常用于监听某些初始化操作,等初始化执行完毕,通知主线程继续执行. 先看示例代码: public class UseCountDownLatch { public ...

  6. java redis expire 1_redis 下key的过期时间详解 :expire

    Redis是一个开源的Key-Value数据缓存,和Memcached类似. Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted se ...

  7. Java 打 jar 包时,MANIFEST.MF 文件详解

    具体详情,详见<MANIFEST.MF文件详解> manifest.mf 的编写规则 不能有空行和空格的地方 第一行不可以是空行(第一行的行前不可以有空行),行与行之间不能有空行,每行的行 ...

  8. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  9. java.util.function包

    目录 Supplier 参数个数扩展 参数类型扩展 特殊变形 Function,r> 参数个数扩展 参数类型扩展 特殊变形 Consumer 参数个数扩展 参数类型扩展 特殊变形 Predica ...

最新文章

  1. matlab肌电信号平滑滤波_BCIduino 滤波和频谱计算操作
  2. Django 之Form
  3. linux睿频是自动的吗,Linux限制cpu睿频限制频率
  4. Anacoda 的 Python 包管理器 Conda 的常用使用命令
  5. DXOMark公布最新相机综合评分:华为P30 Pro不再是唯一王者
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的保险业务管理系统
  7. 借助JavaEE中Timer API实现定时关闭计算机的功能
  8. 软件设计师历年真题与解析(05-18 包括答案)
  9. 求职招聘小程序 毕业设计毕业论文 开题报告和效果图参考(基于微信小程序毕业设计题目选题课题)
  10. 数据科学家也良莠不齐 蹩脚数据科学家的10个迹象
  11. C Primer Plus(第六版)第三章 数据和C
  12. 长【久】守护——Ag+生态抑菌给予家庭健康
  13. 华为研究院19级研究员几年心得终成趣谈网络协议文档,附讲解
  14. 抖音只能上下滑动吗_抖音只能上下滑动吗_实现仿抖音视频滑动的两个方案
  15. HDU 3605 Escape【最大流】
  16. ajaxSubmit的使用总结
  17. 大学JavaWeb课程设计——图书管理系统(应付作业及毕设)
  18. GIS基础(5)空间拓扑
  19. iOS10 获取系统通讯录新方法
  20. 2022年乡村医生考试练习题及答案

热门文章

  1. android编译会生成class吗,请教下Android N混合编译生成的base.art中的类在运行时最终添加到哪个classloader的问题...
  2. 未来之路—写在大二结束之前
  3. Google Guava官方教程
  4. stm32qspi内存映射_STM32F7-discovery QSPI接口使用心得
  5. python encoding报错_菜鸟世界 -docker 环境下解决python 的 UnicodeEncodeError 错误
  6. response.setcharacterencoding 报错是缺哪个包_出街,你缺的是这一款包包...
  7. mysql 导出中文乱码_sqoop导出到mysql中文乱码问题总结、utf8、gbk
  8. Android快速阅读依赖的代码,Java Android快速阅读完整文件
  9. 计算机语言E9,九种编程语言大对比
  10. oracle替换表merge,sql – Oracle – 如何使用merge根据其他表和列中的值更新列