Java正则表达式之Pattern和Matcher

目录

  • 前言
  • 一、Pattern和Matcher的简单使用
  • 二、Pattern详解
    • 2.1 Pattern 常用方法
      • 2.1.1 compile(String regex)
      • 2.1.2 matches(String regex, CharSequence input)
      • 2.1.3 split(CharSequence input)
      • 2.1.4 pattern()
      • 2.1.5 matcher(CharSequence input)
  • 三、Matcher详解
    • 3.1 Matcher 常用方法
      • 3.1.1 matches()
      • 3.1.2 find()
      • 3.1.3 group()
      • 3.1.4 start()
      • 3.1.5 end()
      • 3.1.6 reset(CharSequence input)
  • 总结


前言

之前简单分析了Java正则表达式的基础用法和部分规则:String.matches方法使用
今天来看一下常用来处理正则表达式的两个类:

  1. Pattern  包名:java.util.regex.Pattern;

Pattern 类用于表示一个正则表达式的编译版本。通过 Pattern.compile() 方法可以将一个正则表达式编译成一个 Pattern 对象。
Pattern 类提供了一系列静态方法用于编译和匹配正则表达式,例如 compile()、matches()、split() 等。
通过 Pattern 对象可以获取正则表达式的相关信息,例如正则表达式的字符串表示、标志位等。

  1. Matcher  包名:java.util.regex.Matcher;

Matcher 类用于对输入字符串进行匹配操作。它通过 Pattern.matcher() 方法创建,并用于对指定的输入字符串执行匹配操作。
Matcher 类提供了一系列方法用于执行匹配操作,例如 matches()、find()、group() 等。
通过 Matcher 对象可以获取匹配结果的相关信息,例如匹配的子字符串、匹配的位置等。


一、Pattern和Matcher的简单使用

简单例子代码:

package com.example.Pattern;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PatternTest {public static void main(String[] args) {String input = "Hello, my age is 25 and my friend's age is 30.";// 定义正则表达式String regex = "\\d+"; // 匹配一个或多个数字// 编译正则表达式为 Pattern 对象Pattern pattern = Pattern.compile(regex);// 创建 Matcher 对象,并使用正则表达式匹配输入字符串Matcher matcher = pattern.matcher(input);// 查找匹配的数字while (matcher.find()) {System.out.println("Found: " + matcher.group());}}	
}

result:
在这里插入图片描述
分析:\\d+是匹配1到n个数字,至于findgroup功能后面详解,看样子find方法匹配到就返回true,同时group方法返回捕获到的内容。带着这个简单的例子进入到两个类的详细分析。


二、Pattern详解

2.1 Pattern 常用方法

2.1.1 compile(String regex)

compile(String regex):
compile 方法是 Pattern 类的静态方法,用于将给定的正则表达式字符串编译成一个 Pattern 对象。
该方法接受一个字符串参数 regex,表示要编译的正则表达式。
编译成功后,将返回一个 Pattern 对象,可以用于后续的匹配操作。

示例: 上面已经有了,不重复了。

2.1.2 matches(String regex, CharSequence input)

matches(String regex, CharSequence input):
matches 方法是 Pattern 类的静态方法,用于尝试将给定的正则表达式与整个输入字符串进行匹配。
该方法接受一个字符串参数 regex,表示要匹配的正则表达式,以及一个 CharSequence 参数 input,表示要匹配的输入字符串。
如果整个输入字符串与正则表达式匹配成功,则返回 true;否则返回 false。

示例

public class PatternTest {public static void main(String[] args) {String input = "Hello, my age is 25 and my friend's age is 30.";// 定义正则表达式String regex = "\\d+"; // 匹配一个或多个数字System.out.println(Pattern.matches(regex, "2")); System.out.println(Pattern.matches(regex, "20")); System.out.println(Pattern.matches(regex, " ")); System.out.println(Pattern.matches(regex, "1 2 3 4 ")); System.out.println(Pattern.matches(regex, "abcd")); }	
}

result:
在这里插入图片描述
analysis:

字符串 “2” 符合正则表达式 “\d+”,它包含一个数字字符。
字符串 “20” 也符合正则表达式 “\d+”,它包含两个数字字符。
字符串 " " 不符合正则表达式 “\d+”,它不包含任何数字字符。
字符串 "1 2 3 4 " 不符合正则表达式 “\d+”,它包含空格和数字字符,不是一个连续的数字字符串。
字符串 “abcd” 不符合正则表达式 “\d+”,它不包含任何数字字符。

2.1.3 split(CharSequence input)

split(CharSequence input):
split 方法用于根据正则表达式将输入字符串分割成多个子字符串。
该方法接受一个 CharSequence 参数 input,表示要分割的输入字符串。
返回一个字符串数组,包含了根据正则表达式分割后的子字符串。

示例

  public static void main(String[] args) {System.out.println("-------,测试--------");String text = "apple,banana,orange,pear";Pattern pattern = Pattern.compile(",");String[] result = pattern.split(text);for (String s : result) {System.out.println(s);}   System.out.println("-------\\d+测试--------");String text1 = "1234,banana,2234,pear";Pattern pattern1 = Pattern.compile("\\d+");String[] result1 = pattern1.split(text1);for (String s : result1) {System.out.println(s);} System.out.println("-------\\d测试--------");String text2 = "1234,banana,2234,pear";Pattern pattern2 = Pattern.compile("\\d");String[] result2 = pattern2.split(text2);for (String s : result2) {System.out.println(s);}  }	

result:
在这里插入图片描述

analysis:

字符串 “,” 截取了“,”,所以只剩下数字和字母。
字符串 “\d+” 截取了连续的数字,所以只剩下“,”和字母。
字符串 “\d"截取了单个的数字,所有相比于”\d+"有了很多换行符。

2.1.4 pattern()

pattern():
pattern 方法用于返回当前 Pattern 对象所表示的正则表达式的字符串形式。
该方法不接受任何参数,直接返回当前 Pattern 对象的正则表达式字符串。

示例

    public static void main(String[] args) {Pattern pattern = Pattern.compile(",");String result = pattern.pattern();System.out.println(result);Pattern pattern1 = Pattern.compile("\\d+");String result1 = pattern1.pattern();System.out.println(result1);Pattern pattern2 = Pattern.compile("\\d");String result2 = pattern2.pattern();System.out.println(result2);}	

result:
在这里插入图片描述
analysis:

该方法不接受任何参数,直接返回当前 Pattern 对象的正则表达式字符串。

2.1.5 matcher(CharSequence input)

matcher(CharSequence input):
matcher 方法用于创建一个 Matcher 对象,用于对指定的输入字符串进行匹配操作。
该方法接受一个 CharSequence 参数 input,表示要匹配的输入字符串。
返回一个 Matcher 对象,可以用于后续的匹配操作。

示例

    public static void main(String[] args) {Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法创建 Pattern 对象Matcher matcher = pattern.matcher("1234,banana,2234,pear"); // 使用 Pattern 对象创建 Matcher 对象System.out.println(pattern);System.out.println(matcher);}	

result:
在这里插入图片描述

analysis:

Pattern.compile(“\d+”) 返回的是正则表达式 \d+ 的字符串表示形式。而 pattern.matcher(“1234,banana,2234,pear”) 返回的是 Matcher 对象的字符串表示形式,其中包含了正则表达式模式、匹配的区域和最后的匹配结果。


三、Matcher详解

3.1 Matcher 常用方法

3.1.1 matches()

matches():
matches 方法尝试将整个输入字符串与模式进行匹配。
如果整个输入字符串与模式匹配成功,则返回 true;否则返回 false。

示例

    public static void main(String[] args) {Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法创建 Pattern 对象Matcher matcher = pattern.matcher("1234"); // 使用 Pattern 对象创建 Matcher 对象System.out.println(matcher.matches());matcher = pattern.matcher("1234d");System.out.println(matcher.matches());matcher = pattern.matcher("12.34");System.out.println(matcher.matches());}	

result:
在这里插入图片描述

analysis:

matcher.matches() 会尝试对整个输入字符串进行匹配,如果整个输入字符串匹配成功,则返回 true,否则返回 false。
当输入字符串为 “1234” 时,由于整个字符串都是数字,匹配成功,因此输出为 true。
当输入字符串为 “1234d” 时,由于字符串中包含非数字字符 “d”,匹配失败,因此输出为 false。
当输入字符串为 “12.34” 时,由于字符串中包含小数点 “.”,匹配失败,因此输出为 false。

3.1.2 find()

绝大多数情况下:find()和group()方法是搭配起来使用的。

find():
find 方法在输入字符串中查找下一个匹配的子序列。
如果找到匹配的子序列,则返回 true;否则返回 false。

3.1.3 group()

group():
group 方法返回当前匹配的子序列。
如果在调用 matches、find 等方法后找到了匹配的子序列,可以使用 group 方法获取匹配的内容。

示例

    public static void main(String[] args) {Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法创建 Pattern 对象Matcher matcher = pattern.matcher("1234,banana,2234,pear");while (matcher.find()) {System.out.println("匹配的子序列:" + matcher.group());}matcher = pattern.matcher("1234banana2234pear");while (matcher.find()) {System.out.println("匹配的子序列:" + matcher.group());}}

result:
在这里插入图片描述

analysis:

非常简单
find 方法在输入字符串中查找下一个匹配的子序列。
group 方法返回当前匹配的子序列。

3.1.4 start()

start():
start 方法返回当前匹配的子序列的起始索引。
如果在调用 matches、find 等方法后找到了匹配的子序列,可以使用 start 方法获取匹配子序列的起始索引。

3.1.5 end()

end():
end 方法返回当前匹配的子序列的结束索引。
如果在调用 matches、find 等方法后找到了匹配的子序列,可以使用 end 方法获取匹配子序列的结束索引。

示例

    public static void main(String[] args) {Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法创建 Pattern 对象Matcher matcher = pattern.matcher("1234,banana,2234,pear,911");while (matcher.find()) {System.out.println("匹配的子序列:" + matcher.group());System.out.println("起始子序列:" + matcher.start());System.out.println("结束子序列:" + matcher.end());System.out.println();}	 	}	

result:
在这里插入图片描述

analysis:

第一个匹配的子序列为 “1234”,起始位置是 0,结束位置是 4。
第二个匹配的子序列为 “2234”,起始位置是 12,结束位置是 16。
第三个匹配的子序列为 “911”,起始位置是 22,结束位置是 25。

3.1.6 reset(CharSequence input)

reset(CharSequence input):
reset 方法将 Matcher 对象的状态重置,使其可以重新在输入字符串中进行匹配。
在重复使用 Matcher 对象进行匹配时,可以使用 reset ()方法清除之前的匹配状态。

示例

 public static void main(String[] args) {Pattern pattern = Pattern.compile("\\d+"); // 使用 compile() 方法创建 Pattern 对象Matcher matcher = pattern.matcher("1234,banana,2234");// 第一次匹配while (matcher.find()) {System.out.println("第一次匹配的子序列:" + matcher.group());System.out.println("第一次起始子序列:" + matcher.start());System.out.println("第一次结束子序列:" + matcher.end());System.out.println();}// 重置 Matcher 对象matcher.reset("456,orange,789");// 第二次匹配while (matcher.find()) {System.out.println("第二次匹配的子序列:" + matcher.group());System.out.println("第二次起始子序列:" + matcher.start());System.out.println("第二次结束子序列:" + matcher.end());System.out.println();}}	

result:
在这里插入图片描述

analysis:

第一次匹配之后,我们调用了 reset() 方法并提供了一个新的输入字符串,这样 Matcher 对象的匹配状态就被重置了,可以重新从新的输入字符串中查找匹配的子序列,并输出相应的信息。


总结

Pattern 类是正则表达式的编译表示形式。它通过 compile() 方法将正则表达式编译为一个 Pattern 对象,然后可以使用这个对象来创建 Matcher 对象。Pattern 类提供了一系列静态方法和实例方法,用于对正则表达式进行编译、匹配和其他操作。
Matcher 类是用于对输入字符串进行正则表达式匹配操作的对象。它通过 Pattern 对象的 matcher() 方法创建,并提供了一系列方法用于进行匹配、查找、替换等操作。Matcher 对象可以重复使用,也可以通过 reset() 方法重置其匹配状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块:第三节 JSP四大域对象 一、page范围二、request范围三、session范围四、application范围 在服务器和客户端之间、各个网页之间、哪怕同一个网页之内,总是需要传递各种参数值,这时JSP的内置对象就是传递这些参数的载具。内置对象…

​(四)hive的搭建2

在&#xff08;三&#xff09;hive的搭建1中我们搭建好了hive环境&#xff0c;但是只能本地访问&#xff0c;在本节中配置Hive的访问方式。 1.元数据服务的方式 1.1 编辑hive-site.xml sudo vi hive-site.xml 在文件最后增加以下内容 <!– 指定存储元数据要连接的地址 –…

无里程计下的纯跟踪算法实现

文章目录 概要生成相机坐标系下的三维坐标无里程计下的纯跟踪算法实现 概要 当你只有一个相机的时候&#xff0c;想要快速实现机器人跟随功能&#xff0c;没有里程计的情况下&#xff0c;就可以看这里了。这篇博文实现了一个无里程计下的纯跟踪算法。 生成相机坐标系下的三维…

1、安全开发-Python爬虫EDUSRC目标FOFA资产Web爬虫解析库

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正 前言&#xff1a; 主要包含对requests库和Web爬虫解析库的使用&#xff0c;python爬虫自动化&#xff0c;批量信息收集 Python开发工具&#xff1a;PyCharm 2022.1 激活破解码_安装教程 (2022年8月25日…

Linux下find命令详解

find #查找文件 #按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件 格式&#xff1a; find 查找路径 查找条件 具体条件&#xff08;按文件名或时间大小等&#xff09; 操作 注意&#xff1a; find命令默认的操作是print输出 find是检索…

MATLAB绘制电磁场

MATLAB绘制电磁场举例: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g; m12 for k1:m for j1:m if k1 V(j,k)1; elseif((j1)|(jm)|(km)) V(j,k)0; else …

PKG系统安装包及IPSW固件:MacOS 11-14 Sonoma 正式版

MacOS 14 Sonoma&#xff0c;为提高生产力和创造力带来了全新的功能&#xff0c;有了更多使用小部件和令人惊叹的新屏幕保护程序进行个性化设置的方法&#xff0c;对Safari浏览器和视频会议进行了重大更新&#xff0c;以及优化的游戏体验——Mac体验比以往任何时候都更好。 mac…

贝叶斯的缺点

贝叶斯方法是一种统计学习方法&#xff0c;通过利用贝叶斯定理来计算给定先验概率的情况下&#xff0c;后验概率的条件概率。虽然贝叶斯方法在许多领域中应用广泛且有效&#xff0c;但也存在一些缺点。以下是一些贝叶斯方法的缺点的例子&#xff1a; 1、先验概率的选择 贝叶斯方…

第二十四天| 77. 组合

Leetcode 77. 组合 题目链接&#xff1a;77 组合 题干&#xff1a;给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 思考&#xff1a;回溯法。把回溯法的搜索过程抽象为树形结构。 每次从集合中选取元素&#xff0…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

计算机视觉实战项目4(单目测距与测速+摔倒检测+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A_路径规划+行人车辆计数+动物识别等)

基于YOLOv5的无人机视频检测与计数系统 摘要&#xff1a; 无人机技术的快速发展和广泛应用给社会带来了巨大的便利&#xff0c;但也带来了一系列的安全隐患。为了实现对无人机的有效管理和监控&#xff0c;本文提出了一种基于YOLOv5的无人机视频检测与计数系统。该系统通过使用…

AJAX-认识URL

定义 概念&#xff1a;URL就是统一资源定位符&#xff0c;简称网址&#xff0c;用于访问网络上的资源 组成 协议 http协议&#xff1a;超文本传输协议&#xff0c;规定浏览器和服务器之间传输数据的格式&#xff1b;规定了浏览器发送及服务器返回内容的格式 协议范围&#xf…

flask基于Python的期货交易模拟系统的django-afl61-vue

期货交易模拟系统是一个便于用户在线查看期货投资、取消投资、风险控制、账户资金、持仓资金等&#xff0c;管理员进行管理的平台。因此本文主要论述了系统开发的过程和实现的功能&#xff0c;结合Web技术来实现的期货交易模拟系统。本系统以软件工程理论为开发基础&#xff0c…

UE4 C++ 静态加载类和资源

静态加载类和资源&#xff1a;指在编译时加载&#xff0c;并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

SpringBoot实战2

目录 1.如何返回两个类型的数据&#xff1f;User和Booth 2.如何使用MyBatis遍历一个数组进行查询&#xff1f; 3.前端要的数据太多太杂&#xff0c;我们拼接多个List&#xff0c;前端找数据困难&#xff0c;浪费时间。因此我们进行三表联表查询。 1.首先创建一个vo包&#x…

yo!这里是c++IO流相关介绍

目录 前言 C语言的输入输出 CIO流基本介绍 流的概念 IO流类库 iostream fstream stringstream 后记 前言 学过C语言的输入输出相关知识点的童鞋应该多多少少会觉得有些许麻烦&#xff0c;反正我就是这么觉得的&#xff0c;scanf、printf等函数不仅数量众多&#xff0c…

20240202在WIN10下使用whisper.cpp

20240202在WIN10下使用whisper.cpp 2024/2/2 14:15 【结论&#xff1a;在Windows10下&#xff0c;确认large模式识别7分钟中文视频&#xff0c;需要83.7284 seconds&#xff0c;需要大概1.5分钟&#xff01;效率太差&#xff01;】 83.7284/4200.1993533333333333333333333333…

使用 Go 发送微信群消息

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 背景 最近的某个副业需要我写一个脚本&#xff08;脚本内容就不说了&#xff09;&#xff0c;需要通知群成员&#xff0c;尽快地…

云原生业务全流程DevOps配置预研与实践

背景 我在一个二线城市&#xff08;山东济南&#xff09;&#xff0c;相对与北上广深杭这些IT业发达的城市来说&#xff0c;济南IT业对于业内新技术的接受度是有点慢的&#xff0c;国内很多一线大厂早先几年前就开始实践使用的技术&#xff0c;我们这边也是近两年才开始慢慢兴…

如何计算模型的复杂度(参数量,FLOPs)

参考 如何计算神经网络模型的复杂度 深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式 概念 Params&#xff1a;模型的参数量。&#xff08;空间复杂度&#xff09;FLOPs&#xff1a;FLoating point Operations&#xff0c;前向推理的计算量。&#xff08;时间复…