当前位置: 首页 > 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;多个元素之间用 逗号 隔开列表的元素可以修改 定义 …...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...