Java正则表达式之Pattern和Matcher

news2024/9/28 23:22:43

目录

  • 前言
  • 一、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.coloradmin.cn/o/1429227.html

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

相关文章

​(三)hadoop之hive的搭建1

下载 访问官方网站https://hive.apache.org/ 点击downloads 点击Download a release now! 点击https://dlcdn.apache.org/hive/ 选择最新的稳定版 复制最新的url 在linux执行下载命令 wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz 2.解压…

账簿和明细账

目录 一. 账簿的意义和种类二. 明细账 \quad 一. 账簿的意义和种类 \quad 账簿是由一定格式、互有联系的账页组成,以审核无误的会计凭证为依据,用来序时地、分类地记录和反映各项经济业务的会计簿籍(或称账本)。设置和登记账簿是会计工作的重…

10个常考的前端手写题,你全都会吗?(上)

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…

C++:输入流/输出流

C流类库简介 C为了克服C语言中的scanf和printf存在的缺点。,使用cin/cout控制输入/输出。 cin:表示标准输入的istream类对象,cin从终端读入数据。cout:表示标准输出的ostream类对象,cout向终端写数据。cerr&#xff…

刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为:NLU(理解)和NLG(生成) 信息检索:NLU 文本生成:NLG 机器问答:NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

水表表盘读数识别新体验,带你进入华为云ModelArts算法套件的世界

前言 数字时代,数字化服务已经发展到各行各业,我们的生活中也随处可见。 数字化服务的便捷了我们的衣食住行的方方面面,除了我们日常化的出行、饮食、购物,其实住方面也已有了很深的发展。 水电燃气这三项和我们生活息息相关的…

YOLO-World: Real-Time Open-Vocabulary Object Detection

文章目录 1. Introduction2. Experiments2.1 Implementation Details2.2 Pre-training2.3 Ablation Experiments2.3.1 预训练数据2.3.2 对RepVL-PAN的消融研究2.3.3 文本编码器 2.4 Fine-tuning YOLO-World2.5 Open-Vocabulary Instance Segmentation2.6 Visualizations Refere…

R语言分析任务:

有需要实验报告的可CSDN 主页个人私信 《大数据统计分析软件(R语言)》 实 验 报 告 指导教师: 专 业: 班 级: 姓 名: 学 …

Multisim14.0仿真(四十三)LM311应用

一、LM311简介: lm311是一款高灵活性的电压比较器,能工作于5V-30V单个电源或正负15V分离电源。 二、LM311主要特性: ★ 快速响应时间:165 ns。 ★ 选通能力。 ★ 最大输入偏置电流:300nA。 ★ 最大输入偏置电流&#…

8868体育助力意甲尤文图斯俱乐部 帮助球队签订新合同

意甲的尤文图斯俱乐部是8868合作体育球队之一,根据意大利媒体的消息,尤文图斯已经决定和费德里科-基耶萨续约,这名球员已经开始思考他的将来了。 费德里科-基耶萨今年26岁,他和尤文图斯的合约到2025年6月30号就结束了。他知道很多…

大数据分析|设计大数据分析的三个阶段

文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/1…

flask基于django大数据的证券股票分析系统python可视化大屏

证券分析系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写,使用了Django框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:个人信息修改,对股票信息、股票买入、…

[Linux 进程(六)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制,讲之前我们先把写时拷贝理清,然后再开始讲进程控制。…

从源代码看Chrome 版本号

一直以来都是用Chrome 浏览器,但是看到Chrome 点分4 组数据的表达方式,总是感觉怪怪的,遂深入源代码了解她的版本号具体表示的内容 chrome 浏览器中显示的版本号 源代码中的版本号标识 版本号文件位于 chrome/VERSION , 看到源代…

Docker上安装配置tomcat

目录 1. 拉取镜像 2. 创建运行镜像 3. 查看是否创建成功 ps:如果出现404错误 tomcat目录结构 1. 拉取镜像 这里使用 tomcat:8.5.40 版本作为安装 docker pull tomcat:8.5.40 2. 创建运行镜像 docker run -d --name tomcat -p 8080:8080 \--privilegedtrue …

2024最新版Sublime Text 4安装使用指南

2024最新版Sublime Text 4安装使用指南 Installation and Usage Guide to the Latest Sublime Text 4 in 2024 By JacksonML 0. Sublime Text是什么? Sublime Text 由自定义组件构建,支持Python, Java, C/C等多种编程语言,并为用户提供无与…

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

flutter如何实现省市区选择器

前言 当我们需要用户填写地址时,稳妥的做法是让用户通过“滚轮”来滑动选择省份,市,区,此文采用flutter的第三方库来实现这一功能,比调用高德地图api简单一些。 流程 选择库 这里我选择了一个最近更新且支持中国的…

本体匹配方法概述

目录 前言1 基于术语匹配的方法1.1 字符串匹配1.2 语言方法 2 基于虚拟文档的方法3 基于结构的匹配方法3.1 结构信息利用3.2 Anchor-prompt方法 4 大型本体匹配4.1 本体划分4.2 匹配分块4.3 实体间映射 结语 前言 本文将深入探讨本体匹配的不同方法,从基于术语匹配…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(上)

目录 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市,使用华夫图分析各个城市的情况 1.北京市的空气质量 2.广州市的空气质量 【上海市和成都市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成…