JAVA正则表达式Pattern类与Matcher类详解

2023-10-30

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。

它包括两个类:

Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。

Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。

首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。

一、捕获组的概念

捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:

1        ((A)(B(C)))
2        (A)
3        (B(C))
4        (C)

组零始终代表整个表达式。 以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。
与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba" 与表达式(a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。

二、详解Pattern类和Matcher类

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

1、pattern

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

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

2、Pattern.split(CharSequence input)

Pattern有一个split(CharSequence input)方法,用于分隔字符串,并返回一个String[]

String.split(String regex)是用Pattern.split(CharSequence input)来实现的

3、Pattern.matches(String regex,CharSequence input)

一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.

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

4、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对象的创建的 

5、Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()

Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false 

(1)matches()
对整个字符串进行匹配,只有整个字符串都匹配了才返回true 

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)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 

(3)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

6、Mathcer.start()/ Matcher.end()/ Matcher.group()

当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用start/end/group得到更详细的信息

(1)start()

返回匹配到的子字符串在字符串中的索引位置.

(2)end()

返回匹配到的子字符串的最后一个字符在字符串中的索引位置

(3)group()

返回匹配到的子字符串

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

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

Matcher m3=p.matcher("2223bb");
m3.matches();   //匹配整个字符串
m3.start();   //返回0,原因相信大家也清楚了
m3.end();   //返回6,原因相信大家也清楚了,因为matches()需要匹配所有字符串
m3.group();   //返回2223bb

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,返回第二组匹配到的子字符串 

案例

例如有一段文本,里面有很多数字,而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单. 
Java代码示例: 

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

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA正则表达式Pattern类与Matcher类详解 的相关文章

随机推荐

  • 终止代码driver_irql_not_less_or_equal

    终止代码driver irql not less or equal McAfee和Zone Alarm是导致问题的原因 因此 我们建议卸载它们
  • Stable Diffusion web UI 安装、启动脚本、常见问题、插件(linux)

    Stable Diffusion本身是一个模型 对于大多数想试试的人来说 使用这个web ui版本最合适 建议先看完再动手 虽然不难但是有门槛 主要要解决网络问题 如果深入需要会python 如果只是想试试的 建议直接下载别人打好的包 自己
  • J2EE 高并发体系详解--HTTP Session 失效转移

    HTTP Session 失效转移 几乎所有流行的 J2EE 供应商都在他们的集群产品中实现了 Http Session 失效转移 用来保障当某台服务器失效后会话状态不会丢失 使客户端请求能被正确处理 如图 6 所示 当浏览器访问有状态的
  • 光学单位定义-照度 lux

    照度的单位 勒克斯 勒克斯 lux 法定符号lx 是照度 luminance 的单位 定义 在1平方米面积上所得的光通量是1流明时 它的照度是1勒克斯 照度是反映光照强度的一种物理量 其物理意义是照射到单位面积上的光通量 照度的单位是每平方
  • 1.2 PhalApi 运行Hello World

    运行Hello World 此文章假设你已成功安装PhalApi2项目 如果尚未安装 可阅读下载与安装 编写一个接口 在PhalApi 2 x 版本中 项目源代码放置在 path to PhalApi2 src目录中 里面各个命名空间对应一
  • PCL 改进快速欧式聚类

    目录 一 概述 二 代码实现 三 结果展示 一 概述 论文复现 FEC Fast Euclidean Clustering for Point Cloud Segmentation一文严格按照论文中描述的方法进行算法的复现 未添加点云聚类分
  • python多线程和多进程

    python多线程和多进程
  • Java中Thread类的基本使用

    Thread类的基本用法 1 创建子类 继承自Thread并且重写run方法 class MyThread extends Thread Override public void run System out println hello t
  • 用图讲解 ElasticSearch 搜索原理,你就明白了!

    来源 cnblogs com richaaaard p 5226334 html 文末提示 给大家准备好了ES相关资源 摘要 先自上而下 后自底向上的介绍ElasticSearch的底层工作原理 试图回答以下问题 为什么我的搜索 foo b
  • vue自定义指令/v-loading指令

    v loading指令
  • 跨界电商战略中的Socks5代理与数据采集

    一 跨界电商战略与数据采集的重要性 跨界电商战略旨在拓展市场 获取新机遇 但成功的战略制定离不开准确的市场情报和竞争数据支持 数据采集是了解市场需求 竞争态势的关键步骤 然而在全球范围内采集数据面临地理限制和网络封锁的问题 二 Socks5
  • 基于Tensorflow的MNIST机器学习经典案例的翻译

    说实话 对于学习 很久没有体会到对这种陷进去的感受了 现在是周六下午 我独自一人在空荡荡的办公室 而且昨天在办公室弄到快23 00 今早还是起来顶着高温到办公司10 00多 我做这些不是说加班 目的请看标题 学习一门语言一种数据库一种框架或
  • 如何在Ubuntu20.04上使用vscode编译运行和调试C/C++

    这里写自定义目录标题 一 安装visual stdio code 二 编译与运行 三 配置调试环境 一 安装visual stdio code 打开你的终端 Ctrl Alt T 并且运行下面的命令 sudo snap install cl
  • 围棋布局启蒙(系统学围棋,打实理论基础)

    1 占空角 2 守角的方法 3 挂角的方法 4 小目角的2个定式 5 星位角的2个定式 6 拆边的类型 7 拆边的原则 8 急所 9 布局总结 围棋布局启蒙 系统学围棋 打实理论基础 哔哩哔哩bilibili 教学
  • 【QT】04 对象树(对象模型)

    04 对象树 4 1 对象树概念 4 2 对象树构造及析构过程 释放对象 4 3 1 前提准备 4 3 2 对象树的构建及析构过程 4 3 QT中的坐标系 4 1 对象树概念 在qt中创建对象的时候会提供一个Parent对象指针 下面来解释
  • selenium上传文件解决方案

    说明 1 方式一使用selenium支持的的定位方式xpath解决上传文件问题 2 方式二和方式三使用图片定位方式解决上传文件问题 点击上传文件后 弹出的Windows对话框中 在文件名中输入图片路径 然后点击打开按钮 方式一 path 要
  • iOS开发系列—Objective-C之基础概览

    概览 前面我们已经用了几章内容进行C语言介绍 当然要通过几篇文章完整的介绍C语言的知识是不太现实的 例如C语言的文件操作 内存申请等我们都没有重点介绍 当然核心知识点基本都已经提到了 后面有时间我们会继续扩充 今天我们正式开始学习Objec
  • Java对象和类

    Java 对象和类 Java作为一种面向对象语言 支持以下基本概念 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研 究对象和类的概念 对象 对象是类的一个实例 对象不是找个女朋友 有状态和行为 例如 一条狗是一个对象 它
  • VSCode 基础必备插件 超实用

    猿生不能只有 Ctrl C 和 Ctrl V 还要有 Ctrl D 工欲善其事 必先利其器 今天给大家带来了博主学习前端一年多以来偷懒 呸 提升效率必备的 40 个 vscode 插件 看完觉得有帮助的记得点个赞 HTML 标签自动闭合 A
  • JAVA正则表达式Pattern类与Matcher类详解

    java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式 Matcher 一个Matche