Java21 正则表达式

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 中更加灵活和高效。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flink系列】6. Flink中的时间和窗口

6. Flink中的时间和窗口 在批处理统计中&#xff0c;我们可以等待一批数据都到齐后&#xff0c;统一处理。但是在实时处理统计中&#xff0c;我们是来一条就得处理一条&#xff0c;那么我们怎么统计最近一段时间内的数据呢&#xff1f;引入“窗口”。 所谓的“窗口”&#xff…

AIGC与劳动力市场:技术进步与就业结构的重塑

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;尤其是生成式AI&#xff08;AIGC&#xff09;&#xff0c;劳动力市场正经历前所未有的变革。从内容创作到自动化生产线&#xff0c;几乎每个行业都在经历一场技术的洗礼。然而&#xff0c;这场革命并不是全然…

废品回收小程序,数字化回收时代

随着科技的不断创新发展&#xff0c;废品回收在各种技术的支持下也在不断地创新&#xff0c;提高了市场的发展速度&#xff0c;不仅能够让回收效率更加高效&#xff0c;还能够让居民更加便捷地进行回收&#xff0c;推动废品回收行业的发展。 回收市场机遇 目前&#xff0c;废…

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门&#xff1a; Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译&#xff1a; Iahub正在为国际信息学奥林匹克竞赛&#xff08;IOI&#xff09;做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢&#xff1f; 一排中有n个球…

【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、线程概念 &#x1f4d6; 回顾进程 &#x1f4d6; 引入线程 &#x1f4d6; 总结 &a…

PDF文件提取开源工具调研总结

概述 PDF是一种日常工作中广泛使用的跨平台文档格式&#xff0c;常常包含丰富的内容&#xff1a;包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用&#xff0c;尤其是RAG项目中&#xff0c;通过将非结构化数据转化为结构化和可访问的信息&#xff0…

简历_使用优化的Redis自增ID策略生成分布式环境下全局唯一ID,用于用户上传数据的命名以及多种ID的生成

系列博客目录 文章目录 系列博客目录WhyRedis自增ID策略 Why 我们需要设置全局唯一ID。原因&#xff1a;当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题。 问题&#xff1a;id的规律性太明显、…

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展&#xff0c;越来越多的卖家开始尝试使用云手机来协助他们的业务&#xff0c;这是因为云手机具有许多优势。那么&#xff0c;具体来说&#xff0c;跨境电商使用云手机可以做哪些事情呢&#xff1f; &#xff08;一&#xff09;实现多账号登录和管理 跨境电商…

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程&#xff0c;它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信&#xff0c;本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信&#xff0c;需要借助网络协议栈中的各层协议&#x…

Open3D 计算每个点的协方差矩阵【2025最新版】

目录 一、算法原理1、计算公式2、主要函数3、函数源码二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月18日。 一、算法原理 1、计算公式 对于点云数据中的任意一点 p p p,根据其邻域内点的坐标计算其协方差矩阵。计算公式如下:

e2studio开发RA0E1(16)----配置RTC时钟及显示时间

e2studio开发RA0E1.16--配置RTC时钟及显示时间 概述视频教学样品申请完整代码下载硬件准备参考程序新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_UARTA_Open()函数原型回调函数user_uart_callba…

Go语言strings包与字符串操作:从基础到高级的全面解析

Go语言strings包与字符串操作:从基础到高级的全面解析 引言 Go语言以其简洁、高效和强大的标准库而闻名,其中strings包是处理字符串操作的核心工具。本文将深入探讨Go语言中strings包的功能及其在实际开发中的应用,帮助开发者更好地理解和使用这一工具。 1. strings包概述…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

加密货币的基本交易技术指标

是币安交易市场的基本版视图,trading View是有更复杂的参数追踪。币安的交易的技术指标有主图和副图。有很多指标&#xff0c;让ai解释一下相关概念和意义。加密货币交易中可能遇到的主图指标及其含义&#xff1a; 1. MA&#xff08;移动平均线&#xff0c;Moving Average&…

简单介绍JSONStream的使用

地址 作用 这个模块是根据需要筛选出json数据中自己所需要的数据 使用 var JSONStream require("JSONStream"); var parse require("fast-json-parse"); var fs require("fs");fs.createReadStream("./time.json").pipe(JSONSt…

UOS扩容攻略:迁移home

原文链接&#xff1a;UOS扩容攻略&#xff1a;迁移/home Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于 UOS 扩容攻略&#xff1a;迁移 /home 目录 的文章。相信很多朋友在使用 UOS 系统时&#xff0c;会遇到系统分区空间不足&#xff0c;尤其是 /home 目录存…

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成

文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展&#xff0c;尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型&#xff0c;人工智能等&#xff0c;对操作系统的自然语言交互操作 推出很多功能&#xff0c;值得开发&#xff0c;尤其运…

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

Linux-day08

第17章 大数据定制篇-shell编程 shell编程快速入门 shell变量 设置环境变量 把行号打开 set nu 位置参数变量 预定义变量 在一个脚本中执行了另外一个脚本所以卡住了 CTRLC退出 运算符 operator运算符 条件判断 流程控制 单分支多分支 case语句 for循环 反复的把取出来的i值…