【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类。
- 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作为分隔符,把该字符串分割成多个子串。
- 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!
四、正则表达式的进阶使用
- 字符类中的范围和否定:
- [a-z]:匹配任意小写字母。
- [A-Z]:匹配任意大写字母。
- [0-9]:匹配任意数字。
- [^a-z]:匹配任意非小写字母的字符。
- 分组和命名捕获组:
- (expression):将表达式分组,并捕获匹配的文本。
- (?<name>expression):将表达式分组,并给捕获组命名。
- 零宽度断言:
- (?=exp):零宽度正预测先行断言,断言被匹配的字符串以表达式exp结尾,但不包括exp本身。
- (?<=exp):零宽度正回顾后发断言,断言自身出现的位置前面能匹配表达式exp,但不包括exp本身。
- 条件表达式:
- (?(condition)yes-pattern|no-pattern):根据条件选择匹配yes-pattern或no-pattern。
- 正则表达式的选项:
- 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 捕获组和后向…...

Java知识巩固(七)
目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象,也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…...
Ubuntu22.04 更换源
Ubuntu22.04 更换网易163源 1、编辑/etc/apt/sources.list文件 1 sudo nano /etc/apt/sources.list 2、清空文件内容,拷贝下列163源到文本。 1 2 3 4 5 6 7 8 deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse deb http://mirro…...

江恩理论和波浪理论的结合
结合波浪理论和江恩理论需要综合考虑市场波动的形态以及时间和价格的关系。这两者都是技术分析中的重要工具,能够帮助投资者更好地理解市场的趋势和未来的走势。 波浪理论(Elliott Wave Theory) 波浪理论是由Ralph Nelson Elliott提出的&…...

AJAX——AJAX 取消请求
利用 abort()方法取消请求 本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享AJAX中请求重复发送问题的学习。...

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)
【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 目录 前…...

嵌入式QT中基本工程模板分析
大家好,今天主要来分享一下,如何分析一下QT的工程代码文件。 第一:QT工程分析...

Linux网络:UDP socket - 简单聊天室
Linux网络:UDP socket - 简单聊天室 聊天通信架构ServerInetAddrUdpServerMessageRoutermain Client测试 聊天通信架构 本博客基于Linux实现一个简单的聊天通信服务,以熟悉Linux的网络接口。 总代码地址:[UDPsocket-简单聊天通信] 文件结构…...
Codeforces Round 646 (Div. 2) E. Tree Shuffling(树,贪心)
题目链接 Codeforces Round 646 (Div. 2) E. Tree Shuffling 思路 考虑一个节点 u u u,显然它子树中的操作可以由它本身和祖先来进行。如果它的祖先有比它花费更小的,直接跳过节点 u u u。 我们分别记录每一个子树中位置不对的 0 0 0和 1 1 1的个数&…...

HCIE-Datacom题库_11_IPsecVPN【17道题】
一、单选题 1.IPsecSA(SecurityAssociation,安全联盟)有两种生成方式,分别是手工方式和IKE自动协商方式,以下关于这两种方式的描述中,错误的是哪一项? 手工方式和IKE方式建立的SA都支持动态刷新 IKE方式建立的SA,其生存周期由…...

Dongle Sentinal在Jenkins下访问不了的问题
背景: 工作站部署的jenkins的脚本无法正常打包,定位后发现是本地获取不了license,但是使用usb over network的远程license都能获取并正常打包 分析: 获取不了license的原因是本地无法识别dongle。根据提供信息,之前…...

X射线衍射(X-ray Diffraction,XRD)小白版
文章目录 实验过程原理晶体构成X射线波长diffraction 干涉效应 Braggs Law晶体间距d散射角度θ半波长λ/2公式 公式名称由来应用设备 实验过程 In the X-ray experiment , a sample is placed into the center of an instrument and illuminated with a beam of X-rays. 在X射…...

Nordic 定时器系统app timer[获取时间戳]
获取时间戳 想要在Nordic 定时器系统中获取时间戳,也就是是在调用app_timer的时候时间戳要有效,我们可以看看定时器系统初始化: ret_code_t app_timer_init(void) {ret_code_t err_code;drv_rtc_config_t config {.prescaler APP_TIMER_CONFIG_RTC_FREQUENCY,.int…...

【Linux】实验:mkdir 命令 、 tee 命令
#1024程序员节|征文# 1.命令说明 本文主要实验 linux 的两个命令:mkdir -p 路径、 tee 创建文件。 命令:mkdir -p 路径 说明:该命令将自动创建路径下的目录及子目录,结尾可以/ 也可以不带/,默认都是建文…...

asp.net core mvc发布时输出视图文件Views
var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器,注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录,视图文…...

服务器模块测试
目录 测试逻辑 测试工具 测试 测试逻辑 我们可以使用一个简单的业务处理逻辑来进行测试。 最简单的,我们业务逻辑就直接返回一个固定的字符串 void Message(const PtrConnection&con,Buffer* inbuffer) //模拟用户新数据回调 {inbuffer->MoveReadOf…...
ATTCK 框架讲解
摘要 ATT&CK框架作为MITRE公司开发的网络攻击行为知识库,自2015年发布以来,已成为信息安全领域的重要工具。该框架通过提炼和归纳真实世界中的网络威胁事件,以攻击者的视角构建了一套系统化的战术和技术分类体系。本文详细阐述了ATT&…...

ADC在STM32F1系列的使用详解
目录 1. ADC简介 2. 逐次逼近型ADC(ADC0809) 3. ADC框图(STM32) 4. ADC基本结构 5. 输入通道 6. 转换模式 6.1 单次转换 6.1.1 非扫描模式 6.1.2 扫描模式 6.2 连续转换 6.2.1 非扫描模式 6.2.2 扫描模式…...

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS
欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS 专栏跑道三 ➡️ MYSQL REDIS Advanc…...
中间件-概念
什么是中间件? 中间件(Middleware)是位于 Web 服务器和应用程序之间的组件,它可以处理每个请求和响应。中间件的主要作用是在请求到达应用程序之前或响应返回客户端之前对其进行处理。中间件可以执行各种任务,如日志记…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...