Java21 正则表达式

news2025/1/17 17:49:06

Java 21 中,正则表达式主要通过 java.util.regex 包提供支持,其核心组件包括 PatternMatcherString 类中自带的方法(如 replaceAllmatches)。以下是关于正则表达式在 Java 21 中的详细介绍及一些新的特性或用法。


核心组件

1. Pattern

  • Pattern 是正则表达式的编译表示形式。
  • 使用 Pattern.compile(String regex) 编译正则表达式。
  • 提供了优化匹配的标志位(如 CASE_INSENSITIVEDOTALL)。
Pattern pattern = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("Hello World");
while (matcher.find()) {
    System.out.println(matcher.group()); // 输出 "Hello" 和 "World"
}

2. Matcher

  • Matcher 是执行匹配操作的引擎,依赖于 Pattern
  • 支持多种匹配方式:find()matches()lookingAt() 等。
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("Order 123, Item 456");
while (matcher.find()) {
    System.out.println(matcher.group()); // 输出 123 和 456
}

3. String 中的正则方法

  • matches:检查整个字符串是否匹配正则表达式。
  • replaceAllreplaceFirst:使用正则表达式进行替换。
  • split:使用正则表达式分割字符串。
String str = "apple,banana,orange";
String[] fruits = str.split(",");
for (String fruit : fruits) {
    System.out.println(fruit);
}

常见标志和特性

常用标志位(Pattern 常量)

标志位含义
Pattern.CASE_INSENSITIVE忽略大小写匹配(等价于 (?i))。
Pattern.MULTILINE允许 ^$ 匹配每行的开头和结尾(等价于 (?m))。
Pattern.DOTALL使 . 匹配包括换行符在内的所有字符(等价于 (?s))。
Pattern.UNICODE_CASE结合 CASE_INSENSITIVE,对 Unicode 字符有效。
Pattern.COMMENTS忽略正则中的空白和注释(等价于 (?x))。
Pattern pattern = Pattern.compile("^hello", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher matcher = pattern.matcher("hello world\nHello Java");
while (matcher.find()) {
    System.out.println(matcher.group()); // 输出 "hello" 和 "Hello"
}

正则表达式语法

基础元字符

元字符含义
.匹配任意单个字符(除换行符)。
\d匹配数字(0-9)。
\w匹配字母、数字或下划线。
\s匹配空白字符(空格、制表符等)。
\b匹配单词边界。
^匹配行的开头。
$匹配行的结尾。
[...]匹配括号内任意一个字符。
[^...]匹配括号内没有的任意字符。
Pattern pattern = Pattern.compile("\\d{3}-\\d{2}-\\d{4}");
Matcher matcher = pattern.matcher("123-45-6789");
if (matcher.matches()) {
    System.out.println("Valid format!"); // 输出 "Valid format!"
}

高级语法

表达式含义
(...)分组,捕获子表达式。
(?:...)非捕获分组。
(?=...)正向先行断言(匹配后面紧跟的内容)。
(?!...)负向先行断言(匹配后面不紧跟的内容)。
(?<=...)正向后行断言(匹配前面紧跟的内容)。
(?<!...)负向后行断言(匹配前面不紧跟的内容)。
// 示例:正向先行断言
Pattern pattern = Pattern.compile("\\d+(?= dollars)");
Matcher matcher = pattern.matcher("I owe 100 dollars");
if (matcher.find()) {
    System.out.println(matcher.group()); // 输出 "100"
}

Java 21 中的新特性

  1. Unicode 支持增强

    • Java 21 继续支持最新版本的 Unicode,正则表达式对 Unicode 的处理更加全面。
    • 例如,\p{Script=Latin} 匹配所有拉丁字符。
  2. 更高的性能优化

    • Pattern 的编译器在 Java 21 中进一步优化,能够处理更复杂的正则表达式并提供更快的匹配速度。
  3. 内置内联正则表达式语法改进

    • 可以直接将常用标志(如 CASE_INSENSITIVEDOTALL)内嵌在正则表达式中,无需额外设置。

实践示例

验证邮箱

Pattern pattern = Pattern.compile("^[\\w.%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
Matcher matcher = pattern.matcher("example@example.com");
System.out.println(matcher.matches()); // 输出 true

替换多行文本

String text = "<tag>\nSome content\n</tag>";
String result = text.replaceAll("(?s)<.*?>", "REPLACED");
System.out.println(result); // 输出 REPLACED

提取 URL 中的域名

Pattern pattern = Pattern.compile("https?://([^/]+)");
Matcher matcher = pattern.matcher("https://www.example.com/path");
if (matcher.find()) {
    System.out.println(matcher.group(1)); // 输出 www.example.com
}

总结

在 Java 21 中,正则表达式依然强大,支持 Unicode、标志位、断言等多种高级特性。借助 PatternMatcher,你可以高效地处理复杂的文本匹配需求。此外,性能优化和更广泛的 Unicode 支持让正则表达式在 Java 21 中更加灵活和高效。

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

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

相关文章

使用葡萄城+vue实现Excel

最终实现效果如下 包含增加复选框 设置公式 设置背景颜色等&#xff0c;代码实在太多 有需要可留言 第一步&#xff1a;创建表头 请使用官网提供的网址&#xff1a;在线 Excel 编辑器 | SpreadJS 在线表格编辑器 1.点击下方号&#xff0c;创建一个新的sheet页 默认新创建的she…

[系统安全] 六十一.恶意软件分析 (12)LLM赋能Lark工具提取XLM代码的抽象语法树(初探)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

Linux浅谈——管道、网络配置和客户端软件的使用

目录 一、管道 1、管道符 2、过滤功能 3、特殊功能 4、扩展处理 5、xargs命令扩展 二、网络配置 1、ifconfig查看网络信息 2、配置文件详解 网卡配置文件位置 3、systemctl查看网卡状态 4、systemctl启动/重启/停止网卡 三、客户端软件 1、什么是SSH 2、常用SSH终…

Oracle 深入学习 Part12: Managing Indexes (管理索引)

索引的分类 逻辑分类&#xff1a; 单列和多列&#xff1a; 单列索引&#xff08;single column&#xff09;&#xff1a;对单列数据建立索引。 复合索引&#xff08;concatenated&#xff09;&#xff1a;对多列数据建立索引。 唯一性&#xff1a; 唯一性&#xff08;unique…

【网络安全】FortiOS Authentication bypass in Node.js websocket module

文章目录 漏洞说明严重等级影响的产品和解决措施推荐阅读 漏洞说明 FortiOS存在一个使用替代路径或者信道进行身份验证绕过漏洞&#xff0c;可能允许未经身份验证的远程攻击者透过向Node.js WebSocket模块发送特别设计的请求&#xff0c;可能获得超级管理员权限。 Fortinet 官…

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…

Kutools for Excel 简体中文版 - 官方正版授权

Kutools for Excel 是一款超棒的 Excel 插件&#xff0c;就像给你的 Excel 加了个超能助手。它有 300 多种实用功能&#xff0c;现在还有 AI 帮忙&#xff0c;能把复杂的任务变简单&#xff0c;重复的事儿也能自动搞定&#xff0c;不管是新手还是老手都能用得顺手。有了它&…

计算机数据提取与固定

1.计算机数据的提取与固定 1.课程介绍 电子数据提取与固定、电子数据恢复、电子数据分析。 2.计算机数据提取与固定 数字化时代&#xff0c;计算机和电子设备承载海量素具&#xff0c;这些数据在各类案件调查、事故处理以及合规审计场景扮演关键角色。 3.操作系统定义 操…

VSCode 使用默认profile打开文件

VSCode 本身的定位就是文本编辑器&#xff0c;只是通过各种插件才实现了 IDE 的功能。 如果想要把 VSCode 当作 IDE 和文本编辑器同时使用&#xff0c;就需要注意 profile 切换的问题。 profile 是 VSCode 的一个功能&#xff0c;可以通过多首选项管理不同的环境&#xff0c;比…

Profibus DP转Modbus TCP协议转换网关模块功能详解

Profibus DP 和 Modbus TCP 是两种不同的工业现场总线协议&#xff0c;Profibus DP 常用于制造业自动化领域&#xff0c;而 Modbus TCP 则在工业自动化和楼宇自动化等领域广泛应用。实现 Profibus DP 转 Modbus TCP 功能&#xff0c;通常需要特定的网关设备&#xff0c;以下为你…

镭速大文件传输视频文件预览实现原理

镭速可以支持视频预览&#xff0c;在测试过程中需要大量不同格式的视频&#xff0c;如果直接去找各种格式的视频不太现实&#xff0c;所以就会用到一个视频格式转换的工具ffmpeg&#xff0c;本文将介绍ffmpeg的基本使用方法。FFmpeg 是一个免费开源的音视频处理工具&#xff0c…

keepalived双机热备(LVS+keepalived)实验笔记

目录 前提准备&#xff1a; keepalived1&#xff1a; keepalived2&#xff1a; web1&#xff1a; web2&#xff1a; keepalived介绍 功能特点 工作原理 应用场景 前提准备&#xff1a; 准备4台centos&#xff0c;其中两台为keepalived&#xff0c;两台为webkeepalive…

MySQL(高级特性篇) 02 章——MySQL的数据目录

一、MySQL8的主要目录结构 命令&#xff1a; find / -name mysql 安装好MySQL8之后&#xff0c;我们查看如下的目录结构 &#xff08;1&#xff09;数据库文件的存放路径 MySQL数据库文件的存放路径&#xff1a;/var/lib/mysql/MySQL服务器程序在启动时会到文件系统的某个目…

【C++篇】红黑树的实现

目录 前言&#xff1a; 一&#xff0c;红黑树的概念 1.1&#xff0c;红黑树的规则 1.2&#xff0c;红黑树的最长路径 1.3&#xff0c;红黑树的效率分析 二&#xff0c;红黑树的实现 2.1&#xff0c;红黑树的结构 2.2&#xff0c;红黑树的插入 2.2.1&#xff0c;大致过程…

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…

解锁转型密码:不同方向的技能与素质修炼手册

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 解锁…

HTML中最基本的东西

本文内容的标签&#xff0c;将是看懂HTML的最基本之基本 &#xff0c;是跟您在写文章时候一样内容。一般想掌握极其容易&#xff0c;但是也要懂得如何使用&#xff0c;过目不忘&#xff0c;为手熟尔。才是我们学习的最终目的。其实边看边敲都行&#xff0c;或者是边看边复制粘贴…

NodeJS | 搭建本地/公网服务器 live-server 的使用与安装

目录 介绍 安装 live-server 安装方法 安装后的验证 环境变量问题 Node.js 环境变量未配置正确 全局安装的 live-server 路径未添加到环境变量 运行测试 默认访问主界面 访问文件 报错信息与解决 问题一&#xff1a;未知命令 问题二&#xff1a;拒绝脚本 公网配置…

【excel】VBA股票数据获取(搜狐股票)

文章目录 一、序二、excel 自动刷新股票数据三、付费获取 一、序 我其实不会 excel 的函数和 visual basic。因为都可以用matlab和python完成。 今天用了下VBA&#xff0c;还挺不错的。分享下。 上传写了个matlab获取股票数据的&#xff0c;是雅虎财经的。这次是搜狐股票的数…

Redis的过期策略、内存淘汰机制

Redis只能存5G数据&#xff0c;可是你写了10G&#xff0c;那会删5G的数据。怎么删的&#xff1f;还有&#xff0c;你的数据已经设置了过期时间&#xff0c;但是时间到了&#xff0c;为什么内存占用率还是比较高? 一、Redis的过期策略 Redis采用的是定期删除惰性删除策略。 1…