当前位置: 首页 > news >正文

【Java】探秘正则表达式:深度解析与精妙运用

目录

引言

一、基本概念

1.1 元字符

1.2 预定义字符类

1.3 边界匹配符

1.4 数量标识符

1.5 捕获与非捕获分组 

二、Java中的正则表达式支持

三、正则表达式的使用示例

3.1 匹配字符串 

3.2 替换字符串

3.3 分割字符串 

3.4 使用Pattern和Matcher

3.5 捕获组和后向引用

3.6 贪婪模式和勉强模式的对比

四、正则表达式的进阶使用

结语


引言

正则表达式(Regular Expression)是计算机科学中的一个重要概念,它是一种强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。正则表达式由普通字符(如a~z)和特殊字符(元字符)组成,用于描述在查找文字主体时待匹配的一个或多个字符串。在Java中,正则表达式通过java.util.regex包提供支持,主要包括Pattern和Matcher两个类,以及String类中的几个特殊方法。


一、基本概念

正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。


1.1 元字符

表达式含义
.匹配任意单个字符(换行符除外)
\转义字符,用于匹配特殊字符或表示特殊序列
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
{n}匹配前面的子表达式恰好n次
{n,}匹配前面的子表达式至少n次
{n,m}匹配前面的子表达式至少n次,但不超过m次
[]字符类,匹配方括号中的任意字符
|逻辑“或”操作符,匹配左右两边的表达式之一
()分组,将多个字符或表达式组合成一个子表达式,用于后续引用或操作
(?i)忽略后面字符的大小写

1.2 预定义字符类

表达式含义
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^\d]
\s匹配任何空白字符,包括空格、制表符、换页符等,等价于[\t\n\r\f\v]
\S匹配任何非空白字符,等价于[^\s]
\w匹配任何单词字符(包括字母、数字和下划线),等价于[a-zA-Z0-9_]
\W匹配任何非单词字符,等价于[^\w]

1.3 边界匹配符

表达式含义
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
\b匹配一个单词边界,即单词字符和非单词字符之间的位置
\B匹配非单词边界

1.4 数量标识符

  • 贪婪模式(Greedy):数量表示符默认采用贪婪模式,会一直匹配下去,直到无法匹配为止。
  • 勉强模式(Reluctant):用问号后缀?表示,只会匹配最少的字符,也称为最小匹配模式。
  • 占有模式(Possessive):用加号后缀+表示,目前只有Java支持占有模式,通常比较少用。

1.5 捕获与非捕获分组 

捕获分组: 

        后续还要使用本组的数据

        正则表达式内部使用:\\组号

        正则表达式外部使用:$组好

非捕获分组:

符号含义
(? : 正则)获取所有
(? = 正则)获取前面部分
(? ! 正则)获取不是指定内容的前面部分

二、Java中的正则表达式支持

Java提供了多种方式来使用正则表达式,包括String类中的方法以及Pattern和Matcher类。

  1. String类中的方法
    • boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
    • String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
    • String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
    • String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
  2. Pattern和Matcher类
    • Pattern类:用于表示编译后的正则表达式。通过调用Pattern.compile(String regex)方法,可以将一个字符串形式的正则表达式编译成一个Pattern对象。
    • Matcher类:用于对输入字符串进行匹配操作。通过调用Pattern对象的matcher(CharSequence input)方法,可以创建一个Matcher对象,然后使用该对象进行匹配操作。

三、正则表达式的使用示例


3.1 匹配字符串 

String value = "12345";  
String regex = "\\d{5}";  
boolean matches = Pattern.matches(regex, value);  
System.out.println("The Result is: " + matches); // 输出: The Result is: true

3.2 替换字符串

String s = "1324.5421";  
String s1 = s.replaceAll("[0-4]{4}\\.\\w{4}", "!");  
System.out.println(s1); // 输出: !

3.3 分割字符串 

String s = "1324.5421";  
String[] split = s.split("\\."); // 分割后数组为[1324, 5421]

3.4 使用Pattern和Matcher

String value = "12345";  
String regex = "\\d{5}";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(value);  
System.out.println("The Result is: " + matcher.matches()); // 输出: The Result is: true

3.5 捕获组和后向引用

String text = "go go";  
String regex = "\\b(\\w+)\\b\\s+\\1\\b";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(text);  
while (matcher.find()) {  System.out.println("Found match: " + matcher.group()); // 输出: Found match: go go  
}

3.6 贪婪模式和勉强模式的对比

String str = "hello,java!";  
// 贪婪模式的正则表达式  
System.out.println(str.replaceFirst("\\w*", "■")); // 输出: ■,java!  
// 勉强模式的正则表达式  
System.out.println(str.replaceFirst("\\w*?", "■")); // 输出: ■hello,java!

四、正则表达式的进阶使用

  1. 字符类中的范围和否定
    • [a-z]:匹配任意小写字母。
    • [A-Z]:匹配任意大写字母。
    • [0-9]:匹配任意数字。
    • [^a-z]:匹配任意非小写字母的字符。
  2. 分组和命名捕获组
    • (expression):将表达式分组,并捕获匹配的文本。
    • (?<name>expression):将表达式分组,并给捕获组命名。
  3. 零宽度断言
    • (?=exp):零宽度正预测先行断言,断言被匹配的字符串以表达式exp结尾,但不包括exp本身。
    • (?<=exp):零宽度正回顾后发断言,断言自身出现的位置前面能匹配表达式exp,但不包括exp本身。
  4. 条件表达式
    • (?(condition)yes-pattern|no-pattern):根据条件选择匹配yes-pattern或no-pattern。
  5. 正则表达式的选项
    • Pattern.CASE_INSENSITIVE:忽略大小写。
    • Pattern.MULTILINE:多行模式,使^$能够匹配输入字符串的每一行开头和结尾。
    • Pattern.DOTALL:点匹配所有字符,包括换行符。

结语

正则表达式是一种强大且灵活的字符串处理工具,在Java中得到了广泛的应用。通过掌握正则表达式的基本概念、元字符、预定义字符类、边界匹配符和数量标识符等知识点,以及Java中提供的String类方法和Pattern、Matcher类的使用方式,我们可以高效地处理各种字符串匹配、替换和分割等操作。同时,正则表达式的进阶使用技巧,如字符类中的范围和否定、分组和命名捕获组、零宽度断言和条件表达式等,也为我们提供了更强大的字符串处理能力。

相关文章:

【Java】探秘正则表达式:深度解析与精妙运用

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...

2.6.ReactOS系统中从内核中发起系统调用

2.6.ReactOS系统中从内核中发起系统调用 2.6.ReactOS系统中从内核中发起系统调用 文章目录 2.6.ReactOS系统中从内核中发起系统调用前言 前言 上面我们已经可以看到用户空间&#xff08;R3&#xff09;进行系统调用的全过程即两种方法的具体实现。 系统调用一般时从R3发起的…...

chat_gpt回答:python获取当前utc时间,将xml里时间tag里的值修改为当前时间

你可以使用 lxml 库来读取、修改 XML 文件中的某个标签的值&#xff0c;并将其保存为新的 XML 文件。以下是一个示例代码&#xff0c;展示如何获取当前的 UTC 时间&#xff0c;并将 XML 文件中的某个时间标签修改为当前时间。 示例代码&#xff1a; from lxml import etree f…...

机器学习-语言分析

机器学习 1.1人工智能概述 1.2.1 机器学习与人工智能&#xff0c;深度学习 深度学习->机器学习->人工智能&#xff1b; 人工智能&#xff1a;1950&#xff0c;实现自动下棋&#xff0c;人机对弈&#xff0c;达特茅斯会议->人工智能的起点&#xff0c;1956年8月。克劳…...

Oracle 常见索引扫描方式概述,哪种索引扫描最快!

一.常见的索引扫描方式 INDEX RANGE SCANINDEX FAST FULL SCANINDEX FULL SCAN(MIN/MAX)INDEX FULL SCAN 二.分别模拟使用这些索引的场景 1.INDEX RANGE SCAN create table t1 as select rownum as id, rownum/2 as id2 from dual connect by level<500000; create inde…...

字符串(3)_二进制求和_高精度加法

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 字符串(3)_二进制求和_高精度加法 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…...

《神经网络:智能时代的核心技术》

《神经网络&#xff1a;智能时代的核心技术》 一、神经网络的诞生与发展二、神经网络的结构与工作原理&#xff08;一&#xff09;神经元模型&#xff08;二&#xff09;神经网络训练过程 三、神经网络的应用领域&#xff08;一&#xff09;信息领域&#xff08;二&#xff09;…...

pdf内容三张以上转图片,使用spire.pdf.free

一、依赖 <spire.pdf.free.version>9.13.0</spire.pdf.free.version><itextpdf.version>5.5.13</itextpdf.version><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>$…...

游戏、软件、开源项目和资讯

游戏 标题链接【白嫖正版游戏】IT之家喜加一website 软件 标题链接【白嫖正版软件】反斗限免website 开源项目 标题链接【Luxirty Search】基于Google搜索结果&#xff0c;屏蔽内容农场Github【Video2X】图片/视频超分工具Github 新闻资讯 标题链接分享10个 Claude 3.5 …...

Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案

文&#xff1a;安科瑞郑桐 摘要&#xff1a;大型化工企业供配电具有的集约型特点&#xff0c;化工企业内35kV变电站和10kV变电所数量大、分布广&#xff0c;对于老的大多大型及中型化工企业而言&#xff0c;其变电站或变电所内高压电气设备为旧式继电保护装置&#xff0c;可靠…...

[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)

前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器&#xff0c;通过yum安装软件&#xff0c;可以自动解决包依赖的问题&#xff0c;免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系&#xff0c;默认为mirrorlist.centos.org&#xf…...

在Java中创建多线程的三种方式

多线程的创建和启动方式 在Java中&#xff0c;创建多线程主要有以下三种方式&#xff1a; 继承Thread类实现Runnable接口使用Callable接口与Future 下面是这三种方式的简单示例&#xff0c;以及如何在主类中启动它们。 1. 继承Thread类 class MyThread extends Thread {Ov…...

洛谷 AT_abc374_c [ABC374C] Separated Lunch 题解

题目大意 KEYENCE 总部有 N N N 个部门&#xff0c;第 i i i 个部门有 K i K_i Ki​ 个人。 现在要把所有部门分为 AB 两组&#xff0c;求这两组中人数多的那一组的人数最少为多少。 题目分析 设这些部门共有 x x x 个人&#xff0c;则较多的组的人数肯定大于等于 ⌈ …...

力扣2528.最大化城市的最小电量

力扣2528.最大化城市的最小电量 题目解析及思路 题目要求找到所有城市电量最小值的最大 电量为给城市供电的发电站数量 因此每座城市的电量可以用一段区间和表示&#xff0c;即前缀和 二分最低电量时 如果当前城市电量不够,贪心的想发电站建立的位置&#xff0c;应该是在mi…...

【zookeeper】集群配置

zookeeper 数据结构 zookeeper数据模型结构&#xff0c;就和Linux的文件系统类型&#xff0c;看起来是一颗树&#xff0c;每个节点称为一个znode.每一个Znode默认的存储1MB的数据&#xff0c;每个Znode都有唯一标识&#xff0c;可以通过命令显示节点的信息每当节点有数据变化…...

YOLO11 目标检测 | 导出ONNX模型 | ONNX模型推理

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行目标检测任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 备注&#xff1a;本文是使用Python&#xff0c;编写ONNX模型推理代码的 目…...

PostgreSQL DBA月度检查列表

为了确保数据库系统能够稳定高效运行&#xff0c;DBA 需要定期对数据库进行检查和维护&#xff0c;这是一项非常具有挑战性的工作。 本文给大家推荐一个 PostgreSQL DBA 月度性能检查列表&#xff0c;遵循以下指导原则可以帮助我们实现一个高可用、高性能、低成本、可扩展的数…...

驱动开发系列12 - Linux 编译内核模块的Makefile解释

一:内核模块Makefile #这一行定义了要编译的内核模块目标文件。obj-m表示目标模块对象文件(.o文件), #并指定了两个模块源文件:helloworld-params.c 和 helloworld.c。最终会生成这 #这两个.c文件的.o对象文件。 obj-m := helloworld-params.o helloworld.o#这行定义了内核…...

用js+css实现圆环型的进度条——js+css基础积累

如果用jscss实现圆环型的进度条&#xff1a; 直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><met…...

TDengine 与北微传感达成合作,解决传统数据库性能瓶颈

在当今物联网&#xff08;IoT&#xff09;快速发展的背景下&#xff0c;传感器技术已成为各个行业数字化转型的关键组成部分。随着设备数量的激增和数据生成速度的加快&#xff0c;如何高效地管理和分析这些数据&#xff0c;成为企业实现智能化运营的重要挑战。尤其是在惯性传感…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…...

mcts蒙特卡洛模拟树思想

您这个观察非常敏锐&#xff0c;而且在很大程度上是正确的&#xff01;您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些&#xff0c;您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”&#xff0c;这个观察非…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...