正则表达式基本语法和Java中的简单使用
先来个例子
public static final Pattern CHINESE_PATTERN = Pattern.compile("[\\u4e00-\\u9fa5]");
/ 检测字符串是否包含汉字
String text = "Hello 世界";
boolean hasChinese = CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字
Matcher matcher = CHINESE_PATTERN.matcher(text);
while (matcher.find()) {System.out.println(matcher.group()); // 输出 "世" 和 "界"
}// 移除非汉字字符
String chineseOnly = text.replaceAll(CHINESE_PATTERN.pattern(), "");
// 结果为 "世界"
1. 核心步骤
-
编译正则表达式:通过
Pattern.compile()将字符串形式的正则表达式编译为Pattern对象。 -
创建Matcher对象:通过
Pattern.matcher(CharSequence input)生成Matcher实例。 -
执行匹配操作:使用
Matcher的方法进行匹配、查找、替换等操作。
2. 基础用法示例
匹配整个字符串
Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字
Matcher matcher = pattern.matcher("1234");
boolean isMatch = matcher.matches(); // true
查找子串
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("test 123 test 456");
while (matcher.find()) {System.out.println(matcher.group()); // 输出 123 和 456
}
替换操作
Matcher matcher = pattern.matcher("test 123 test 456");
String replaced = matcher.replaceAll("XXX"); // "test XXX test XXX"
3. 分组与捕获
正则表达式中的括号()表示分组,可通过group(int group)获取内容:
Pattern pattern = Pattern.compile("(\\w+)=(\\d+)"); // 键值对格式
Matcher matcher = pattern.matcher("key=123");
if (matcher.matches()) {String key = matcher.group(1); // "key"String value = matcher.group(2); // "123"
}
4. 常用方法
Matcher类
-
matches():整个字符串是否完全匹配。 -
find():查找下一个匹配的子串。 -
group():返回匹配的字符串(group(0)等效)。 -
start()/end():匹配子串的起始/结束索引。 -
replaceAll(String replacement):替换所有匹配项。 -
replaceFirst(String replacement):替换第一个匹配项。
Pattern类
-
split(CharSequence input):按正则式分割字符串。 -
static boolean matches(String regex, CharSequence input):快速匹配。
5. 示例代码
分割字符串
Pattern pattern = Pattern.compile(",");
String[] parts = pattern.split("a,b,c"); // ["a", "b", "c"]
命名分组(Java 7+)
Pattern pattern = Pattern.compile("(?<name>\\w+)=(?<value>\\d+)");
Matcher matcher = pattern.matcher("user=42");
if (matcher.find()) {String name = matcher.group("name"); // "user"String value = matcher.group("value"); // "42"
}
6. 注意事项
-
转义字符:Java字符串中的反斜杠需写为
\\(如\\d表示数字)。 -
异常处理:
Pattern.compile()可能抛出PatternSyntaxException。 -
状态依赖:调用
group()前需先执行匹配操作(如find()或matches())。
通过结合Pattern和Matcher,可以高效实现复杂的字符串匹配、提取和替换逻辑。
一、Java正则表达式特点
在程序开发过程中,经常回遇到需要匹配,查找,替换判断的情况,如果仅仅用纯编码的方式解决,肯定会很吃力,所以,正则表达式就出现了,目的就是用来处理字符串的一系列操作。
- 正则表达式定义了字符串的模式
- 正则表达式还支持多种语言,该文章用Java进行讲解。
二、基本语法
- 正则表达式最常用包为: java.util.regex,该包包括以下三个类(具体方法,参照java-API)
Pattern类:pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher类:Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException类:是一个非强制异常类,它表示一个正则表达式模式中的语法错误
- 基本规则:正则表达式大全语法:点这里
三、三大算法
3.1 搜索算法
- 作用:提供了有用的索引值,精确表明主串在哪能找到匹配(主串为被匹配的字符串,通常为输入或者某处获取的字符串,模式串为正则表达式锁表示的串)
- 主要使用的方法:
public int start():返回以前匹配的初始索引。
public int start(int group):返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
public int end():返回最后匹配字符之后的偏移量。
public int end(int group):返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
public class Demo {public static final String TEST = "This is " +"my small example string which I'm going to use for pattern matching.";public static void main(String[] args) {Pattern pattern = Pattern.compile("(is)"); //含有单词is的位置Matcher matcher = pattern.matcher(TEST);System.out.println(TEST.length());// 检查所有的结果while (matcher.find()) { //find()返回Boolean类型,表示是否到字符串尾部,没有则后移System.out.println("Start index: " + matcher.start()); //起始位置System.out.println(" End index: " + matcher.end() + " "); //终点位置System.out.println(matcher.group()); //打印该组的信息}}
}
3.2 匹配算法
- 用于检查主字串是否符合模式串(返回值为Boolean类型)
- 主要使用的方法有:
public boolean lookingAt(): 尝试将从区域开头开始的输入序列与该模式匹配。 只要主串的开头匹配就可以返回true. 例如:abc去匹配abcde,开头匹配,则返回true。
public boolean find():尝试查找与该模式匹配的输入序列的下一个子序列。
public boolean find(int start):重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
public boolean matches(): 尝试将整个区域与模式匹配。必须整个主串匹配才返回true
public class Demo {public static void main(String[] args) {String tel = "18000001111";String telReg = "1[358]\\d{9}"; // 字符串要匹配的正则表达式System.out.println(tel.matches(telReg));/*Pattern pattern = Pattern.compile("(15)|(18)|(13)");Matcher matcher = pattern.matcher("18000001111");System.out.println(matcher.lookingAt()); //表示只要以15/18/13开头即可,不需要满足11位数字*/Pattern pattern = Pattern.compile("1[358]\\d{9}");Matcher matcher = pattern.matcher("18000001111");System.out.println(matcher.matches()); //满足整个表达式的条件才返回true}
}
3.替换算法
- 替换方法是替换输入字符串里文本的方法。
- 主要方法有:
public String replaceAll(String replacement):替换模式串与给定替换字符串相匹配的所有字串(子序列)。
public String replaceFirst(String replacement):替换模式与给定替换字符串匹配的输入序列的第一个字串。
public Matcher appendReplacement(StringBuffer sb, String replacement): 将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里
public StringBuffer appendTail(StringBuffer sb):将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。
public static String quoteReplacement(String s):返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。
public class Demo {public static void main(String[] args) {Pattern pattern = Pattern.compile("[a-zA-Z]");//匹配字符串中的英文字母String str1 = "erkktyqqquizzzzzo";//将叠词替换成$. //将重叠的字符替换成单个字母。zzzz->z// replaceAllDemo(str1,"(.)\\1+","$1");Matcher matcher = pattern.matcher("wer1389980000ty1234564uiod234345675f");System.out.println(matcher.replaceAll("#")); //将所有英文字母替换为#System.out.println(matcher.replaceFirst("\\¥")); //将第一个英文字母替换为¥}
}
此外,对于 appendReplacement 与 appendTail的操作如下:
public class Demo {//为了方便以及维护,通常将主串写为静态私有的全员变量private static String REGEX = "a*b";private static String INPUT = "aabfooaabfooabfoobkkk";private static String REPLACE = "-";public static void main(String[] args) {Pattern pattern = Pattern.compile(REGEX);Matcher matcher = pattern.matcher(INPUT);StringBuffer sb = new StringBuffer();while (matcher.find()) {matcher.appendReplacement(sb, REPLACE); //将所有已替换的字串 和 该字串后的字串保存道sb对象中去}System.out.println(sb);matcher.appendTail(sb); //将最后一个可替换字串之后的字串保存到对象中去 即将kkk保存到sb对象中//System.out.println(sb.toString());System.out.println(sb);//对象自动调用了toString方法}
}
相关文章:
正则表达式基本语法和Java中的简单使用
先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...
Mysql 回表查询,什么是回表查询,如何拒绝sql查询时的回表问题
文章目录 1. 什么是回表(回表查询)2. 如何减少回表3. 使用案例3.1 问题分析3.2 避免回表查询3.3 开始优化前言: 在继续讲解专栏内容之前,先学习几个概念,以便更好了解: 什么是聚簇索引什么是回表查询这篇文章详细分析 回表查询。聚簇索引的理解可以进入这篇文章:什么是聚…...
Spring Boot响应压缩配置与优化
一、核心工作机制 1.1 自动协商触发条件 Spring Boot的响应压缩功能基于智能协商机制,需同时满足以下条件方可触发: 客户端支持:请求头包含Accept-Encoding: gzip/deflate数据量阈值:响应体大小超过预设值(默认2KB&…...
常考计算机操作系统面试习题(三上)
目录 1. 为何要引入与设备的无关性?如何实现设备的独立性? 2. 页面置换先进先出算法 3. 页面置换先进先出算法,4个页框 4. 进程优先级调度算法 5. 短作业优先调度策略 6. 平均内存访问时间计算 7. 页式存储和段式存储的物理地址计算 …...
MATLAB 绘制空间分布图 方法总结
方法一:用mapshow函数 figure(1); hold on %% 添加陆地 land shaperead(landareas); mapshow(landareas.shp, FaceColor, [1 1 1], EdgeColor, [0.3 0.3 0.3],FaceAlpha,0)%% 添加站点 for i 1:size(mycmap,1)mapshow(lon(label i),lat(label i),displaytype,po…...
Maven工具学习使用(三)——坐标和依赖
坐标元素 Maven坐标是通过一些元素定义的,元素包括groupId、artifactId、version、packaging、classifier groupId:定义当前Maven项目隶属的实际项目。Maven项目和实际项目不是一对一的关系。一个实际的项目对应的Maven模块可能会有很多,比如SpringFramework。groupId不应…...
命令模式(Command Pattern)★
命令模式(Command Pattern) 如果任务有多个复杂的操作,可以使用命令模式将任务的操作封装为命令对象。这些命令对象可以在需要时按顺序执行,方便管理任务执行的逻辑和回滚操作。 示例: class Command { public:virtu…...
深度学习论文: Image Segmentation Using Text and Image Prompts
深度学习论文: Image Segmentation Using Text and Image Prompts Image Segmentation Using Text and Image Prompts PDF: https://arxiv.org/abs/2503.10622v1 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/…...
Docker+Ollama+Xinference+RAGFlow+Dify+Open webui部署及踩坑问题
目录 一、Xinference部署 (一)简介 (二)部署 (三)参数 (四)错误问题 (五)Xinference配置Text-embedding模型 (六)Xinference配…...
Axure项目实战:智慧城市APP(四)医疗信息(动态面板、选中交互应用)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP医疗信息模块 主要内容:医疗信息模块原型设计与交互 应用场景:医疗信息行业 案例展示: 案例视频&…...
缓存设计模式
缓存设计模式(Cache Design Pattern)是一种用于存储和管理频繁访问数据的技术,旨在提高系统性能、降低数据库或后端服务的负载,并减少数据访问延迟。以下是几种常见的缓存设计模式,并用 Python Redis 进行示例代码实现…...
第十三章:优化内存管理_《C++性能优化指南》_notes
优化内存管理 一、内存管理基础概念二、自定义分配器三、智能指针优化重点知识代码示例:智能指针性能对比 四、性能优化关键点总结多选题设计题答案与详解多选题答案设计题示例答案(第1题) 一、内存管理基础概念 重点知识 动态内存分配开销…...
【网络通信安全】基于华为 eNSP 的链路聚合、手工负载分担模式与 LACP 扩展配置 全解析
目录 一、引言 二、链路聚合技术基础 2.1 链路聚合的定义与作用 2.2 链路聚合的工作原理 2.3 链路聚合的模式分类 三、华为 eNSP 简介 3.1 eNSP 的概述 3.2 eNSP 的安装与配置 3.2.1 安装环境要求 3.2.2 安装步骤 3.2.3 配置虚拟网卡 四、手工负载分担模式配置 4.…...
RK3568笔记八十: Linux 小智AI环境搭建
若该文为原创文章,转载请注明原文出处。 最近小智AI火了,韦老师出了 Linux 小智 AI 聊天机器人 版本,想移植到 RK3568上, 由于和韦老师硬件不同,所以需要交叉编译一些库,为后续移植做准备。 一、环境 1、…...
Transformer 通关秘籍2:利用 BERT 将文本 token 化
前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。 在你没了解这方面…...
Spring Boot分布式项目异常处理实战:从崩溃边缘到优雅恢复
当单体应用拆分成分布式系统,异常就像被打开的潘多拉魔盒:RPC调用超时、分布式事务雪崩、第三方接口突然罢工…在最近的电商大促中,我们的系统就经历了这样的至暗时刻。本文将用真实代码示例,展示如何构建分布式异常处理体系。 一…...
Vue3 中使用 Sortablejs 实现拖拽排序功能 序号不更新问题
Vue3 中使用 Sortablejs 实现拖拽排序功能 序号不更新问题 安装依赖 npm install sortablejs --save简单使用 <template><div class"app-container"><div class"table-header"><el-button type"primary" click"hand…...
网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算
文章目录 OSPF域内路由计算:单区域的路由计算一、OSPF单区域路由计算原理二、1类LSA详解2.1 1类LSA的作用与结构2.2 1类LSA的四种链路类型 三、OSPF路由表生成验证3.1 查看LSDB3.2 查看OSPF路由表3.3 查看全局路由表 四、2类LSA详解4.1 2类LSA的作用与生成条件4.2 2…...
【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等
Dify介绍 官网:https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…...
Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类
为了简化使用Coil加载网络图片和GIF的过程,我们可以封装一个工具类。这个工具类将包括初始化ImageLoader的方法、加载图片到ImageView的方法,以及可能的其他便捷方法,如加载圆形图片、设置占位图等。下面是一个示例: 首先&#x…...
CUDA 学习(2)——CUDA 介绍
GeForce 256 是英伟达 1999 年开发的第一个 GPU,最初用作显示器上渲染高端图形,只用于像素计算。 在早期,OpenGL 和 DirectX 等图形 API 是与 GPU 唯一的交互方式。后来,人们意识到 GPU 除了用于渲染图形图像外,还可以…...
棱镜七彩受邀出席“供应链安全国家标准贯标应用深度行”活动并做主题分享
近日,“供应链安全国家标准贯标应用深度行”活动在北京顺利举办,此次活动汇聚了行业内的众多专家和企业代表,深入探讨了供应链安全国家标准的制定与实施路径。棱镜七彩副总裁黄浩东受邀出席,并发表了题为《国家标准实施路径下的企…...
Vue3项目中的.vscode文件夹
.vscode 文件夹主要用于存放与 Visual Studio Code(VS Code)编辑器相关的项目配置文件,这些文件能让项目在 VS Code 里的开发体验更加个性化和高效。 extensions.json 在 .vscode 文件夹中,extensions.json 文件的作用是列出项目…...
系统转换、系统维护、净室软件工程、构件软件工程(高软51)
系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…...
K8S学习之基础四十四:k8s中部署Kibana
在Kubernetes集群中安装Kibana通常涉及使用Helm Chart或直接使用Kubernetes Manifest文件。以下是使用Helm Chart安装Kibana的步骤: 添加Elastic Helm仓库 首先,添加Elastic的Helm仓库: bash 复制 helm repo add elastic https://helm.ela…...
联核防爆无人叉车:高危环境中的安全搬运守护者
联核防爆AGV无人叉车是专为易燃易爆环境设计的智能搬运设备,其特点、功能与应用场景均围绕“安全”与“智能”核心展开:联核科技官网-AGV叉车十大品牌-无人叉车厂家-自动化叉车-智能搬运码垛机器人-智能叉车系统解决方案专家 一、核心特点 防爆设计电气…...
23种设计模式-责任链(Chain of Responsibility)设计模式
责任链设计模式 🚩什么是责任链设计模式?🚩责任链设计模式的特点🚩责任链设计模式的结构🚩责任链设计模式的优缺点🚩责任链设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题
一、问题 在使用集群服务器前可以查看导入,module load不需要安装。我都是自己重新下载Anaconda3-2024.10-1-Linux-x86_64.sh,然后安装,导致混乱。下面是情况 1.创建的环境名跑到目录下了 2.多个base,且有个base无显示 二、解决办法 1.删…...
python蓝桥杯刷题的重难点知识笔记
1、datetime模块 datetime.date:代表日期,包含年、月、日信息。datetime.time:代表时间,包含时、分、秒、微秒信息。datetime.datetime:结合了日期和时间,包含年、月、日、时、分、秒、微秒信息。datetime.…...
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
一、前言 在移动互联网蓬勃发展的今天,视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议,开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV(Flash Video)格式,尽管随着H…...
