一、什么是正则表达式?

正则表达式(Regular Expression)是一种文本模式,用于描述、匹配、搜索或替换符合某种规则的字符串。其在日志提取、表单校验、配置清洗、数据爬取等场景中被广泛使用。

Java 提供了完整的正则表达式支持,核心类如下:

  • java.util.regex.Pattern:编译正则表达式

  • java.util.regex.Matcher:对文本进行匹配、提取

  • String.matches() / replaceAll() / split() 等方法:简化使用

示例代码:

Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
Matcher matcher = pattern.matcher("2025-07-10");
if (matcher.matches()) {System.out.println("匹配成功");
}

二、正则表达式语法概览(核心语法)

语法含义示例说明
.任意字符(除换行)a.c可匹配 abc, a9c
^开始^abc必须以 abc 开头
$结束xyz$必须以 xyz 结尾
*0 次或多次a*可匹配 "", a, aaaa
+1 次或多次a+不匹配空串
?0 次或 1 次a?匹配 0 或 1 次 a
{n}恰好 n 次a{3}匹配 aaa
{n,}至少 n 次a{2,}至少两个 a
{n,m}n~m 次a{2,4}2 到 4 个 a
[]字符类[abc]匹配 a、b、c 中任意一个
[^]排除字符类[^abc]不匹配 a/b/c
```cat
()分组(abc)+分组重复匹配
\d数字\d+等价于 [0-9]+
\w单词字符[a-zA-Z0-9_]
\s空白字符包括空格、换行、制表符

三、Java 使用建议(工程实践)

1. 推荐写法:Pattern + Matcher

Pattern pattern = Pattern.compile("^[a-zA-Z0-9_-]{4,16}$");
Matcher matcher = pattern.matcher("user_1234");
if (matcher.matches()) {// 合法用户名
}

2. 避免错误写法

// 错误:正则表达式字符串忘记转义
Pattern.compile("\d{3}"); // 实际匹配的是"d{3}",不是数字

应写为:

Pattern.compile("\\d{3}");

四、正则表达式学习路径

第一阶段:语法基础

  • 学习字符类([abc]\d)、量词(*+?)、边界(^$

第二阶段:复杂匹配

  • 分组与捕获、非贪婪匹配、断言(正向 / 负向)

第三阶段:调试与性能

  • 使用 Matcher 提取组信息、使用预编译 Pattern 避免重复编译

  • 注意回溯型表达式造成的性能问题(避免 (a+)+


五、常见场景与对应正则表达式

1. 表单验证(校验用户输入)

场景正则表达式说明
用户名(4-16位)^[a-zA-Z0-9_-]{4,16}$字母数字下划线
中文名^[\u4e00-\u9fa5]{2,10}$只支持中文
邮箱^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$常见邮箱格式
手机号(中国)^1[3-9]\d{9}$三大运营商
身份证(中国18位)`^\d{6}(1819
密码强度(数字+字母)^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$至少一个字母和数字

2. 网络相关

场景正则表达式
IPv4`^((25[0-5]
URL`^(http
域名^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,}$

3. 时间与日期

场景正则表达式
日期(yyyy-MM-dd)^\d{4}-\d{2}-\d{2}$
时间(HH:mm:ss)`^([01]\d
年月日时间戳^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$

4. 日志抽取与数据清洗

场景正则表达式提示
提取日志级别`\b(INFODEBUG
提取 JSON 键值对"(\w+)":\s*"([^"]+)"适合简单 JSON
去除 HTML 标签<[^>]+>清洗富文本
去除空白字符\s+用于压缩字符串
清除特殊字符[^a-zA-Z0-9\u4e00-\u9fa5]保留中英文与数字

六、常见问题与性能陷阱

⚠️ 正则性能陷阱

  • (a+)+ 会造成回溯爆炸,处理大文本时极其慢;

  • 避免重复编译:将 Pattern 定义为静态成员或缓存;

  • 替换时,尽量使用非捕获组 (?:...) 避免组开销;

  • 编写复杂表达式时推荐加注释(Java 8+ 支持 (?x) 模式):

Pattern.compile("(?x)  # 启用注释模式\\d{4}            # 年份-                 # 分隔符\\d{2}            # 月份-                 # 日
");

七、构建正则表达式库(正则标准化)

建议为团队或项目构建统一正则工具类,方便调用与维护:

public class RegexLib {public static final String EMAIL = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$";public static final String PHONE = "^1[3-9]\\d{9}$";public static final String ID_CARD = "^\\d{17}[\\dXx]$";public static final String DATE = "^\\d{4}-\\d{2}-\\d{2}$";public static boolean match(String pattern, String input) {return Pattern.matches(pattern, input);}
}

使用:

if (RegexLib.match(RegexLib.EMAIL, "user@test.com")) {// 合法邮箱
}

八、总结:正则表达式在工程中的地位

在中大型项目中,正则表达式应作为工具语言中的基础技能被系统掌握。学习正则不仅是掌握语法,更要理解其行为模型与性能特性,避免常见陷阱,构建可复用的正则库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913926.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913926.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913926.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火山引擎Data Agent全面上线售卖!以企业级数据智能体,重构数据应用范式

资料来源&#xff1a;火山引擎-开发者社区 在火山引擎2025春季FORCE原动力大会现场&#xff0c;火山引擎数智平台解决方案总经理萧然宣布&#xff0c; 企业级数据智能体Data Agent即日起正式上线售卖 。该产品旨在通过DataAI的深度融合&#xff0c;助力企业实现数据价值的挖掘与…

uniapp AndroidiOS 定位权限检查

定位权限检查 // 检查定位权限状态 export const checkPermission () > {const platform uni.getSystemInfoSync().platform;console.log(platform, platform)// #ifdef APP-PLUSif (platform android) {// Androidreturn checkAndroidPermission();} else if (platform …

深入理解Java虚拟机(JVM):从内存管理到性能优化

深入理解Java虚拟机&#xff08;JVM&#xff09;&#xff1a;从内存管理到性能优化 目录 引言JVM架构概述 1. 类加载器&#xff08;Class Loader&#xff09;2. 运行时数据区&#xff08;Runtime Data Areas&#xff09;3. 执行引擎&#xff08;Execution Engine&#xff09;…

PHP SimpleXML:深入理解与高效使用

PHP SimpleXML:深入理解与高效使用 引言 PHP SimpleXML 是一个用于解析和操作 XML 文档的库。它简化了 XML 的处理过程,使得 PHP 开发者可以更加轻松地与 XML 数据交互。本文将深入探讨 PHP SimpleXML 的基本概念、使用方法以及在实际开发中的应用。 SimpleXML 简介 Simp…

双模秒切,体验跃迁!飞利浦EVNIA双模游戏显示器27M2N6801M王者降临!

当沉浸式画质与电竞级流畅无法共存&#xff0c;EVNIA Mini LED双模游戏显示器27M2N6801M以破界之姿革新而来&#xff01;全新搭载 4K160Hz / FHD320Hz双模显示引擎&#xff0c;将视觉震撼与操作跟手性推向全新高度。心念所动间&#xff0c;即可在电影级3A世界与分秒必争的电竞战…

Transformer:自注意力驱动的神经网络革命引擎

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 从语言理解到多模态智能的通用架构基石 ⚙️ 一、核心定义与历史意义 …

汽车电子电气架构中的关键计算单元解析

汽车电子电气架构正经历从分布式到集中式的重大变革&#xff0c;ECU、域控制器、中央计算单元等计算设备在这一演进过程中扮演着不同角色。这些设备按功能层级可分为传统控制层、域集中层和中央计算层&#xff0c;各自承担特定计算任务&#xff0c;共同构成智能汽车的"大脑…

Pandas 学习(数学建模篇)

今天学习数学建模2023年C篇&#xff08;228&#xff09;优秀论文 2023高教社杯全国大学生数学建模竞赛C题论文展示&#xff08;C228&#xff09; - 2023C题论文 - 中国大学生在线 一.pd.DataFrame pd.DataFrame() 是 pandas 库中用于创建二维表格数据结构&#xff08;DataFr…

第七讲:C++中的string类

目录 1、认识string类 2、标准库中的string类 2.1、string类的常见接口 2.1.1、构造与赋值重载 2.1.2、迭代器 2.1.3、容量 2.1.4、访问 2.1.5、修改 2.1.6、字符串操作 2.1.7、成员常量 2.1.8、非成员函数 2.1.9、转换函数 2.2、vs和g下的string 2.2.1、vs下的s…

elementUI 前端表格table数据导出(一)

为啥前端导出不在赘述了第一步&#xff1a;安装xlsxnpm install xlsx第二步&#xff1a;创建js文件html2excelimport * as XLSX from xlsx;const htmlToExcel {getExcel(dom, title temp){var excelTitle title;// const XLSX require("xlsx");var wb XLSX.util…

LabVIEW 波形图表横坐标显示当前日期

LabVIEW 程序如何实现波形图表横坐标显示当前日期一、XY Graph 时间关联逻辑&#xff08;右上角分支&#xff09;功能本质实时采集当前系统时间&#xff08;秒数形式&#xff0c;基于 1904 基准&#xff09;&#xff0c;直接映射为 XY Graph 的 X 轴时间标识&#xff0c;实现动…

Android Soundtrigger唤醒相关时序学习梳理

本文所写内容是在高通芯片平台相关代码基础上学习整理汇总&#xff0c;如有描述不当之处&#xff0c;欢迎指正&#xff01;1、SoundTrigger注册唤醒监听事件回调流程&#xff08;SoundTrigger HAL层到ADSP层&#xff0c;不包括FWK层&#xff09;//(1)SoundTriggerSession 回调 …

OSPF实验以及核心原理全解

OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;广泛应用于中大型网络中。它通过维护网络拓扑信息&#xff0c;使用 SPF&#xff08;最短路径优先&#xff09;算…

Using Spring for Apache Pulsar:Transactions

本节介绍Spring for Apache Pulsar如何支持事务。OverviewSpring for Apache Pulsar事务支持是基于Spring Framework提供的事务支持构建的。在高层&#xff0c;事务资源向事务管理器注册&#xff0c;事务管理器反过来处理注册资源的事务状态&#xff08;提交、回滚等&#xff0…

在Ubuntu上从零开始编译并运行Home Assistant源码并集成HACS与小米开源的Ha Xiaomi Home

目录1. 前言&&叠甲2. 使用的环境3. 相关链接4. 前期步骤4.1 安装路径提前说明4.2 Ubuntu 相关依赖安装4.3 Python源码编译安装4.3.1 编译安装4.3.2 换源4.3.3 环境变量5. 构建Home Assistant源码5.1 clone源码5.2 创建虚拟Python环境5.3 安装项目依赖5.4 安装项目5.5 运…

【实习篇】之Http头部字段之Disposition介绍

Http头部字段之DispositionDisposition头部字段介绍RFC规范介绍RFC 6266与RFC 2047实习的时候公司将一个某个关于下载的Bug交给了我来修&#xff0c;看了代码和日志后发现是Disposition字段的规范兼容性惹的锅&#xff0c;因为有些协议使用的是老协议&#xff0c;我们的项目没有…

VM文件管理与Vi/vim操作

[rootlocalhost /]# sudo mkdir /opt [rootlocalhost /]# sudo mkdir /opt/tmp [rootlocalhost /]# sudo touch /opt/tmp/a.txt [rootlocalhost /]# ls /opt/tmp/ a.txt [rootlocalhost /]# 3.步骤1&#xff1a;创建文件并插入日期时间vi /tmp/newfile在vi编辑器中输入以下命令…

【Android】安卓四大组件之内容提供者(ContentProvider):从基础到进阶

你手机里的通讯录&#xff0c;存储了所有联系人的信息。如果你想把这些联系人信息分享给其他App&#xff0c;就可以通过ContentProvider来实现。。 一、什么是 ContentProvider ‌ContentProvider‌ 是 Android 四大组件之一&#xff0c;负责实现‌跨应用程序的数据共享与访问…

Vue-19-前端框架Vue之应用基础组件通信(二)

文章目录 1 v-model(父子相传)1.1 App.vue1.2 Father.vue1.2.1 v-model用在html标签上1.2.2 v-model用在html标签上(本质写法)1.2.3 v-model用在组件标签上1.2.4 v-model用在组件标签上(本质写法)1.3 MyInput(自定义的组件)1.4 修改modelValue1.4.1 Father.vue1.4.2 MyInput.vu…

宝塔下载pgsql适配spring ai

1.宝塔安装pgvector 1.先去github下载pgvectorpgvector/pgvector: Open-source vector similarity search for Postgres 2.把压缩包上传到系统文件的/temp下解压&#xff0c;重命名文件名为pgvector&#xff0c;之后命令操作 cd /tmp cd pgvector export PG_CONFIG/www/serv…