Java正则表达式之Pattern和Matcher

2024-02-01 15:20

本文主要是介绍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() 方法重置其匹配状态。

这篇关于Java正则表达式之Pattern和Matcher的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667655

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定