java 正则 详解

Java 正则表达式详解

Java 提供了强大的正则表达式支持,位于 java.util.regex 包中。正则表达式(Regular Expression)是一种用来定义字符串匹配模式的语言,广泛应用于字符串的搜索、替换和分割等操作。


1. 核心类和接口

在 Java 中,正则表达式的主要实现依赖以下两个类:

  1. Pattern
    • 编译后的正则表达式。
    • 提供用于定义和编译正则表达式的方法。
  2. Matcher
    • 用于执行匹配操作的引擎。
    • 提供了匹配、查找、替换等操作的方法。

2. Pattern

Pattern 类用于表示编译后的正则表达式。它提供了以下主要方法:

2.1 编译正则表达式

使用 Pattern.compile(String regex) 编译正则表达式:

Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字

2.2 常用方法

方法描述
compile(String regex)编译正则表达式,返回一个 Pattern 对象。
matcher(CharSequence input)返回一个 Matcher 对象,用于匹配指定输入字符串。
split(CharSequence input)根据正则表达式分割输入字符串,返回一个字符串数组。
pattern()返回正则表达式的字符串表示。

3. Matcher

Matcher 类用于操作正则表达式并执行匹配。它主要依赖于一个 Pattern 对象。

3.1 创建 Matcher

通过 Pattern.matcher(CharSequence input) 创建:

Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc123def456");

3.2 常用方法

方法描述
matches()检查整个字符串是否完全匹配正则表达式。
find()查找字符串中与正则匹配的子串(可多次调用找到多个匹配)。
group()返回最近一次匹配的子串。
start()返回最近一次匹配的子串在输入中的起始索引。
end()返回最近一次匹配的子串在输入中的结束索引(不包括结束位置)。
replaceAll(String replacement)用指定字符串替换所有匹配的子串。
replaceFirst(String replacement)用指定字符串替换第一个匹配的子串。
group(int group)返回捕获组的子串。
groupCount()返回正则表达式中的捕获组数目。

4. 快速上手

4.1 匹配

import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String input = "123abc456";Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字Matcher matcher = pattern.matcher(input);System.out.println("Input: " + input);System.out.println("Pattern: " + pattern.pattern());while (matcher.find()) {System.out.println("Match: " + matcher.group() + " at [" + matcher.start() + ", " + matcher.end() + ")");}}
}

输出

Input: 123abc456
Pattern: \d+
Match: 123 at [0, 3)
Match: 456 at [6, 9)

4.2 分割

import java.util.regex.*;public class SplitExample {public static void main(String[] args) {String input = "apple,orange;banana grape";Pattern pattern = Pattern.compile("[,; ]"); // 匹配逗号、分号或空格String[] result = pattern.split(input);for (String word : result) {System.out.println(word);}}
}

输出

apple
orange
banana
grape

4.3 替换

import java.util.regex.*;public class ReplaceExample {public static void main(String[] args) {String input = "abc123def456";Pattern pattern = Pattern.compile("\\d+"); // 匹配数字Matcher matcher = pattern.matcher(input);String replaced = matcher.replaceAll("#"); // 替换所有数字为 #System.out.println(replaced); // 输出:abc#def#}
}

4.4 验证输入

import java.util.regex.*;public class ValidationExample {public static void main(String[] args) {String email = "user@example.com";Pattern pattern = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$");Matcher matcher = pattern.matcher(email);if (matcher.matches()) {System.out.println("Valid email");} else {System.out.println("Invalid email");}}
}

5. 正则表达式语法

5.1 常用元字符

元字符描述示例
.匹配任意单个字符(换行符除外)。a.c 匹配 abca-c
\d匹配数字 [0-9]\d+ 匹配 123456
\D匹配非数字字符。\D+ 匹配 abc
\w匹配字母、数字或下划线 [A-Za-z0-9_]\w+ 匹配 word_123
\W匹配非字母、数字或下划线。\W+ 匹配 @!#
\s匹配空白字符(空格、制表符等)。\s+ 匹配空格或换行。
\S匹配非空白字符。\S+ 匹配非空白部分。

5.2 量词

量词描述示例
*匹配前一个字符 0 次或多次。a* 匹配 ""aaaa
+匹配前一个字符 1 次或多次。a+ 匹配 aaaa
?匹配前一个字符 0 次或 1 次。a? 匹配 ""a
{n}匹配前一个字符恰好 n 次。a{3} 匹配 aaa
{n,}匹配前一个字符至少 n 次。a{2,} 匹配 aaaaa
{n,m}匹配前一个字符 n 到 m 次。a{1,3} 匹配 aaaaaa

5.3 边界匹配

边界描述示例
^匹配行的开头。^abc 匹配以 abc 开头的字符串。
$匹配行的结尾。abc$ 匹配以 abc 结尾的字符串。
\b匹配单词边界。\bword\b 匹配 word
\B匹配非单词边界。\Bword\B 不匹配 word

5.4 分组和引用

语法描述示例
()定义一个分组。(abc)+ 匹配 abcabc
``或运算符,表示匹配多个选项之一。
\n引用第 n 个分
组的匹配。(.)\1 匹配重复字符,如 aa

6. 总结

优点

  • Java 正则表达式强大且灵活,支持复杂的匹配模式。
  • 提供了丰富的 API,可以方便地操作字符串(如匹配、分割和替换)。

注意事项

  • 正则表达式是大小写敏感的。
  • 特殊字符需要转义(如 .*?)。
  • 复杂正则可能难以阅读,建议添加注释或使用分组提高可读性。

正则表达式在 Java 中的应用非常广泛,如验证用户输入、文本分析、日志处理等。合理使用正则表达式,可以大大提高代码效率和简洁性。

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

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

相关文章

springboot:少量配置信息情形

发现无论怎么改都还是指向8001 所以换一种方法 通过 结果 代码 import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCusto…

SpringBoot的快速入门

Maven Maven可以方便管理依赖的 Jar 包 IDEA 自带Maven,也可以选择自己安装 安装Maven:https://blog.csdn.net/qq_59636442/article/details/142314019 创建项目 通过Spring Initializr 快速创建项目:https://start.springboot.io/ 我的项目名叫blog&a…

2024中国高校计算机大赛 — 大数据挑战赛-赛后复盘

一、赛题描述 基于气象大数据的自动站实况联合预测 风光清洁能源的管理与气象关系密不可分,因为风能和太阳能的发电效率直接依赖于气象条件。风力发电需要精确的风速和风向预测,而太阳能发电则依赖于日照时间和云层覆盖情况的准确预报。优质的气象预测…

J.U.C - 深入解析ReentrantLock原理源码

文章目录 概述synchronized的缺陷1)synchronized不能控制阻塞,不能灵活控制锁的释放。2)在读多写少的场景中,效率低下。 独占锁ReentrantLock原理ReentrantLock概述AQS同步队列1. AQS实现原理2. 线程被唤醒时,AQS队列的…

基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现二

一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而…

DBSCAN聚类——基于密度的聚类算法(常用的聚类算法)

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)简称密度聚类或密度基础聚类,是一种基于密度的聚类算法,也是一种常用的无监督学习算法,特别适用于形状不规则的聚类和含有噪声的数据集。主要用于…

C++:指针和引用

指针的基础 数据在内存当中是怎么样被存储的 数据在内存中的存储方式取决于数据的类型和计算机的体系结构 基本数据类型 整数类型:整数在内存中以二进制补码的形式存储。对于有符号整数,最高位为符号位,0 表示正数,1 表示负数。…

LabVIEW多通道面阵烟雾透过率测试系统

LabVIEW面阵烟雾透过率测试系统通过高精度多通道数据采集和实时处理技术,能够实现对固体推进剂烟雾的透过率进行精确测量。系统利用了LabVIEW的图形化编程环境及其丰富的设备驱动接口,有效提升了测试的自动化程度和数据处理的实时性。 项目背景&#xf…

PDF电子发票信息转excel信息汇总

PDF电子发票信息提取,支持将pdf发票文件夹下的剩所有发票,转为excel格式的信息,对于发票量比较大,不好统计,需要一个一个去统计的情况,可节省2个点以上的时间,一次下载,终身有效。 使…

51c视觉~合集7

我自己的原文哦~ https://blog.51cto.com/whaosoft/11536996 #Arc2Face 身份条件化的人脸生成基础模型,高一致性高质量的AI人脸艺术风格照生成 将人脸特征映射到SD的CLIP的编码空间,通过微调SD实现文本编码器转换为专门为将ArcFace嵌入投影到CLIP潜在…

【西瓜书】机器学习的模型评估

来源于西瓜书、南瓜书等内容。 误差与偏差 学习器的实际预测输出与样本的真实输出之间的差异,称为”误差“(error)。学习器在训练集上的误差,称为”训练误差“(training error)或”经验误差“(…

Mac安装Docker Desktop搭建K8s集群,解决镜像无法下载的问题

使用 Docker Desktop可以在本地方便地搭建出 K8s集群,但开启 K8s集群后往往会遇到 K8s 镜像拉取失败问题,本文旨在解决该问题,从而在本地搭建 K8s 集群。 安装Docker Desktop 安装 Docker Desktop 建议安装历史版本, 不建议安装最新版。因为…

【Leecode】Leecode刷题之路第54天之旋转矩阵

题目出处 54-螺旋矩阵-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 54-旋转矩阵-官方解法 方法1:模拟 思路: 代码示例:(Java&#xff…

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients(系数)作用1.…

Cesium教程01_实现Cartesian3 三维坐标操作

在 Vue 项目中使用 Cesium 实现 Cartesian3 三维坐标操作 目录 一、引言二、Cesium 与 Cartesian3 的优势三、示例应用:在地图上标注和计算距离 1. 项目结构2. 主要代码实现3. 运行与效果 四、代码讲解与扩展 1. Cartesian3 的基础操作2. 距离计算与中点标注 五、…

Qt5-雷达项目

界面: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QTimer> #include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget(); pr…

A040-基于springboot的智能停车计费系统设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

数据结构初识

目录 1.初识 2.时间复杂度 常见时间复杂度举例&#xff1a; 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇&#xff1a…

CUDA HOME does not exist, unable to compile CUDA op(s),已解决

有一个服务器上没有/usr/loacl/cuda&#xff0c;我也没有权限在这个目录装cuda&#xff0c;使用pip装完torch&#xff0c;llama factory使用时出现&#xff1a; 应该是本地没有nvcc相关执行文件。 先使用了&#xff1a; conda install -c cudatoolkit-dev不管用&#xff0c; …

杰发科技AC7801——ADC定时器触发的简单使用

使用场景 在需要多次采样结果的情况下&#xff0c;比如1s需要10w次的采样结果&#xff0c;可以考虑使用定时器触发采样&#xff0c;定时器设置多少的时间就会多久采样转换一次。 再加上使用dma&#xff0c;采样的结果直接放在dma的数组里面。 实现了自动采样&#xff0c;自动…