当前位置: 首页 > news >正文

Java--正则表达式入门指南

        正则表达式(Regular Expression)是一种用于匹配字符串中字符模式的工具。在Java中,正则表达式的使用主要依赖于java.util.regex包,其中最重要的两个类是PatternMatcher。今天将探讨正则表达式的基础概念、书写规则、常用方法,以及在Java中如何有效使用它们。

一、正则表达式的基本语法

正则表达式中有两种主要的界定字符:

  1. 方括号 []:用于定义字符集。方括号中的任意单个字符都会被匹配。例如:

    • [abc] 匹配字符 ab 或 c
    • [0-9] 匹配任意数字字符(从 0 到 9)。
    • [^abc] 匹配任何不是 ab 或 c 的字符。 
  2. 双引号 "":在Java代码中,双引号用于表示字符串。当我们在代码中书写正则表达式时,正则表达式本身通常用双引号括起来。例如:

    • "\\d" 表示匹配一个数字字符(\d在Java中需要被转义为\\d)。

 二、常用匹配的书写方法

在正则表达式中,有一些常用的匹配符号和语法规则:

  • .:匹配任意单个字符(除了换行符)。
  • *:匹配前面的表达式零次或多次。例如,a*匹配 ""、aaa 等。
  • +:匹配前面的表达式一次或多次。例如,a+匹配 aaa 等,但不匹配 ""。
  • ?:匹配前面的表达式零次或一次。例如,a?匹配 "" 或 a
  • {n}:精确匹配n次,例如,a{3}匹配 aaa
  • {n,}:至少匹配n次,例如,a{2,}匹配 aaaaa等。
  • {n,m}:匹配至少n次,至多m次,例如,a{1,3}匹配 aaaaaa
  • ^:匹配字符串的开始位置。
  • $:匹配字符串的结束位置。

通过以上符号,我们可以构建灵活的匹配模式。例如,[a-zA-Z]+ 可以匹配一个或多个字母。

三、Pattern类和Matcher类

在Java中,使用正则表达式时,通常需要创建PatternMatcher对象。

  1. Pattern类:用于编译正则表达式。常用方法包括:

    • compile(String regex):编译给定的正则表达式。
    • matcher(CharSequence input):返回一个匹配给定输入序列的Matcher对象。
    • matches():检查输入字符串是否与正则表达式完全匹配。
  2. Matcher类:用于执行匹配操作。常用方法包括:

    • matches():尝试匹配输入序列与模式的整个内容。
    • find():尝试在输入序列中查找下一个子序列,与模式匹配。
    • group():返回最后匹配的子序列。
    • replaceAll(String replacement):用给定的替换字符串替换所有匹配的子序列。

四、示例代码

        以下是一个完整的Java程序示例,演示如何使用正则表达式匹配电子邮件地址并展示PatternMatcher的常用方法:

import java.util.regex.Pattern;
import java.util.regex.Matcher;public class EmailValidator {public static void main(String[] args) {String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; // 邮件正则表达式Pattern pattern = Pattern.compile(emailRegex);String[] emails = { "test@example.com", "invalid-email@", "user.name+tag+sorting@example.com" };for (String email : emails) {Matcher matcher = pattern.matcher(email);// 使用 matches() 方法检查字符串是否匹配if (matcher.matches()) {System.out.println(email + " is valid.");} else {System.out.println(email + " is invalid.");}}}
}

在上面的代码中:

  • 我们定义了一个用于匹配电子邮件地址的正则表达式。
  • 使用Pattern.compile创建了一个Pattern对象。
  • 对每个输入的电子邮件地址,创建了Matcher对象并使用matches()方法检查其是否匹配。

五、正则表达式中的 + 符号

在正则表达式中,+ 是一个量词,表示“至少匹配一次”。这意味着前面的表达式必须出现至少一次,可以搭配其他字符一起使用。下面是一些包含 + 的常见例子:

  1. 示例:匹配一个或多个数字

String regex = "\\d+"; // 匹配一个或多个数字
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("abc123def456");
while (matcher.find()) {System.out.println(matcher.group()); // 输出:123 456
}

 2.示例:匹配连续的字母

String regex = "[a-zA-Z]+"; // 匹配一个或多个字母
Matcher matcher = pattern.matcher("Hello123World");
while (matcher.find()) {System.out.println(matcher.group()); // 输出:Hello World
}

3.示例:匹配至少一个空格

String regex = "\\s+"; // 匹配一个或多个空白字符
Matcher matcher = pattern.matcher("Hello   World");
while (matcher.find()) {System.out.println("Matched whitespace of length: " + matcher.group().length()); // 输出:Matched whitespace of length: 3
}

六、隐式匹配

        在Java中,有些方法可以直接在String类中用于正则表达式匹配,而无需显式地创建Pattern类和Matcher类。这些方法包括String类的matches()replaceAll()split()等。这些方法在内部已经实现了正则表达式的编译和匹配,因此用户只需提供正则表达式字符串和目标字符串,Java虚拟机会自动处理其他的细节。

使用字符串方法的示例

以下是一些常用字符串方法的示例,展示如何在不显式使用PatternMatcher类的情况下,利用正则表达式处理字符串。

1. matches() 方法

matches() 方法用来检查一个字符串是否完全匹配给定的正则表达式。

public class MatchesExample {public static void main(String[] args) {String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; // 邮件正则表达式String email = "test@example.com";// 使用matches()方法进行匹配boolean isValidEmail = email.matches(emailRegex);System.out.println("Is valid email: " + isValidEmail); // 输出:Is valid email: true}
}

在这个例子中,matches()方法会自动编译正则表达式并检查整个字符串是否与它匹配。

2. replaceAll() 方法

replaceAll() 方法用给定的替换字符串替换匹配正则表达式的所有子序列。

public class ReplaceAllExample {public static void main(String[] args) {String originalText = "I have 2 apples and 3 bananas.";String regex = "\\d+"; // 匹配一个或多个数字// 使用replaceAll()方法替换所有数字为"X"String replacedText = originalText.replaceAll(regex, "X");System.out.println("Replaced Text: " + replacedText); // 输出:Replaced Text: I have X apples and X bananas.}
}
3. split() 方法

split() 方法根据正则表达式拆分字符串,生成一个字符串数组。

public class SplitExample {public static void main(String[] args) {String text = "apple,orange,banana,grape";String regex = ","; // 以逗号为分隔符// 使用split()方法拆分字符串String[] fruits = text.split(regex);for (String fruit : fruits) {System.out.println(fruit); // 输出每个水果名称}}
}

        在这个例子中,split()方法会利用提供的正则表达式拆分字符串并返回数组,同样,正则表达式会在内部被自动编译。

总结

        正则表达式在Java中是强大且灵活的工具,用于字符串的匹配和处理,必须掌握PatternMatcher类的用法。

        希望这篇博客能为您的Java正则表达式学习之旅提供帮助!

相关文章:

Java--正则表达式入门指南

正则表达式(Regular Expression)是一种用于匹配字符串中字符模式的工具。在Java中,正则表达式的使用主要依赖于java.util.regex包,其中最重要的两个类是Pattern和Matcher。今天将探讨正则表达式的基础概念、书写规则、常用方法&am…...

阿里云服务器 篇十(加更二):自动定时备份CSDN博客内容:更新文件最后修改时间,以在个人博客正确展示最近更新

文章目录 系列文章核心修改更新后的核心代码使用方法系列文章 阿里云服务器 篇一:申请和初始化 阿里云服务器 篇二:搭建静态网站 阿里云服务器 篇三:提交搜索引擎收录 阿里云服务器 篇四:404页面模板 阿里云服务器 篇五:短链服务网站 阿里云服务器 篇六:GitHub镜像网站 …...

Python编程探索:从基础语法到循环结构实践

文章目录 前言1. 行与缩进:Python代码的灵魂2. 数据类型的转换:灵活处理数据3. 字符串切片:提取字符串的子部分4. 字符串拼接:连接多个字符串5. 逻辑运算符:处理布尔值6. 成员运算符:检查值是否存在于序列中…...

今天要重新认识下注解@RequestBody

在Spring框架中,RequestBody是一个常用的注解,它用于将HTTP请求体中的数据绑定到控制器(Controller)处理方法的参数上。这个注解通常与RESTful Web服务一起使用,在处理POST或PUT请求时尤为常见,因为这些请求…...

北斗有源终端|智能5G单北斗终端|单兵|单北斗|手持机

在当今科技日新月异的时代,智能设备的创新与升级速度令人目不暇接。其中,智能5G终端作为连接数字世界的桥梁,正逐步渗透到我们生活的方方面面。今天,让我们聚焦于一款集尖端科技与实用功能于一身的智能5G设备——QM-L5智能5G单北斗…...

【题解】—— LeetCode一周小结44

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结43 28.冗余连接 II 题目链接:685. 冗余连接 II 在…...

faiss 用于检索10亿向量(维度768)的方法

faiss 用检索10亿向量(维度768)的方法,注意考虑占用内存空间大小不能超过100G,因为100G已经是很多服务器内存的极限了,有的128G已经是超规格的机器了。价格也就是2000左右(月租)。 要处理 10 亿个 768 维的向量,并且限制内存占用不超过 100G,我们需要使用 FAISS 中的…...

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…...

Kubernetes Extended Resource 扩展资源使用简介

Kubernetes 除了提供基于 CPU 和内存的传统计算资源调度外&#xff0c;还支持自定义的 Extended Resource 扩展资源&#xff0c;以便调度和管理其它各种类型的资源。 Extended Resource Extended Resource 扩展资源的创建和使用过程如下图所示&#xff1a; 定义资源&#xff…...

基于STM32的天气时钟项目教学

引言 随着物联网技术的普及&#xff0c;基于STM32的微控制器被广泛应用于各种智能设备的开发。本项目旨在打造一个基于STM32的天气时钟&#xff0c;除了显示当前时间&#xff0c;还可以通过Wi-Fi获取当地天气信息&#xff0c;提供一个实用的生活工具。 环境准备 在开始项目之前…...

神经网络进行波士顿房价预测

前言 前一阵学校有五一数模节校赛&#xff0c;和朋友一起参加做B题&#xff0c;波士顿房价预测&#xff0c;算是第一次自己动手实现一个简单的小网络吧&#xff0c;虽然很简单&#xff0c;但还是想记录一下。 题目介绍 波士顿住房数据由哈里森和鲁宾菲尔德于1978年Harrison …...

C++builder中的人工智能(7)如何在C++中开发特别的AI激活函数?

在当今的AI开发中&#xff0c;人工智能模型正迅速增加。这些模型使用数学函数来执行和学习&#xff0c;以便在传播时优化最佳结果&#xff0c;或在反向传播时选择最佳解决方案。其中之一就是激活函数。也称为转移函数或阈值函数&#xff0c;它决定了神经元的激活值作为输出&…...

更改lvgl图片的分辨率(减少像素)达到减小内存占用的目的

lvgl的内存占比过大&#xff0c;更改图片的分辨率&#xff08;减少像素&#xff09;达到减小内存占用的目的&#xff0c;可以用更多的空间去开发其他的功能 -- 由于lvgl中图片占的内存过大&#xff0c;所以需要更改图片的分辨率&#xff08;降低像素的方式&#xff09; --注意…...

python的socket库的基本使用总目录

章节总目录 一、Python 实现UDP通讯的简单模型 二、Python 实现TCP通讯的简单模型 三、Python 实现TCP和UDP通讯代码的区别...

golang学习3

Go 语言之旅...

Python解力扣算法题(六)(详解+注释)

# 1.学校打算为全体学生拍一张年度纪念照。根据要求&#xff0c;学生需要按照 非递减 的高度顺序排成一行。 # 排序后的高度情况用整数数组 expected 表示&#xff0c;其中 expected[i] 是预计排在这一行中第 i 位的学生的高度&#xff08;下标从 0 开始&#xff09;。 # 给你一…...

【C++】继承和多态常见的面试问题

文章目录 继承笔试面试题1. 什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;2. 什么是菱形虚拟继承&#xff1f;如何解决数据冗余和二义性&#xff1f;3. 继承和组合的区别&#xff1f;什么时候用继承&#xff1f;什么时候用组合&#xff1f; 选择题 多态概念考察…...

入门网络安全工程师要学习哪些内容(详细教程)

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…...

【游戏引擎之路】登神长阶(十二)——DirectX11教程:If you‘re going through hell, keep going!

【游戏引擎之路】登神长阶&#xff08;十二&#xff09;——DirectX11教程&#xff1a;If youre going through hell, keep going! 2024年 5月20日-6月4日&#xff1a;攻克2D物理引擎。 2024年 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 2024年 6月13日-6月20日&#x…...

Python列表(一图秒了)

一、概念 所谓的列表是由一些列按照顺序存储的元素组成&#xff0c;区别于C语言中的数组&#xff0c;可以存储多种类型的数据&#xff0c;其中元素之间是没有任何关系的。 注意&#xff1a; 元素放在[]里面的&#xff0c;多个元素之间用 逗号 隔开列表的元素可以修改 定义 …...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...