正则表达式详解及应用

正则表达式(Regular Expression),简称正则,是一种用于匹配字符串中字符组合的模式。它广泛应用于字符串查找、替换、数据验证等任务中。在Java中,正则表达式的支持由java.util.regex包提供。本文将详细介绍正则表达式的基础知识、用法和示例,帮助你全面理解和应用正则表达式。

正则表达式简介

正则表达式是一种字符序列,它定义了一个搜索模式。主要用于字符串模式匹配,如检索、替换、验证字符串。

基本结构
  • 字面字符:直接匹配字符本身,如a1A
  • 元字符:具有特殊意义的字符,如.*+?[]()等。

常见元字符
  • .:匹配任意单个字符(不包括换行符)。
  • *:匹配前面的子表达式零次或多次。
  • +:匹配前面的子表达式一次或多次。
  • ?:匹配前面的子表达式零次或一次。
  • []:匹配括号内的任意字符。
  • ():分组符,用于将多个字符作为一个单独的单元进行处理。
  • \:转义字符,用于转义元字符。

正则表达式用法

在Java中,正则表达式主要通过PatternMatcher类来使用。

1. Pattern

用于编译正则表达式。常用方法:

  • Pattern.compile(String regex): 编译给定的正则表达式。
2. Matcher

用于匹配正则表达式。常用方法:

  • Matcher.matches(): 尝试将整个输入序列与模式匹配。
  • Matcher.find(): 尝试在输入序列中查找与模式匹配的子序列。
  • Matcher.group(): 返回由以前匹配操作所匹配的输入子序列。

示例代码

以下是一些常见的正则表达式使用示例。

示例1:基本匹配
import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String input = "hello123";//w+:匹配一个或多个单词字符(字母、数字或下划线)。//d+:匹配一个或多个数字。String pattern = "\\w+\\d+";Pattern compiledPattern = Pattern.compile(pattern);Matcher matcher = compiledPattern.matcher(input);if (matcher.matches()) {System.out.println("The input matches the pattern.");} else {System.out.println("The input does not match the pattern.");}}
}/*
输出 The input matches the pattern.
*/
示例2:分割字符串

当调用str.split("\\s+")时,split方法会寻找一个或多个连续的空白字符,并以这些空白字符作为分隔符进行分割。

public class SplitExample {public static void main(String[] args) {String str = "Java    is    fun";// 使用一个或多个空白字符作为分隔符// \\s:匹配任何空白字符,包括空格、制表符、换行符等。// +:匹配前面的子表达式一次或多次。String[] words = str.split("\\s+");// 打印分割后的字符串数组for (String word : words) {System.out.println(word);}}
}
/*
Java
is
fun
*/

常见正则表达式符号及其解释

字符类
  • [abc]:匹配 abc 中的任意一个字符。
  • [^abc]:匹配除 abc 之外的任意字符。
  • [a-zA-Z]:匹配任意大小写字母。
  • [0-9]:匹配任意数字。
  • [a-z]:匹配任意小写字母。
  • [A-Z]:匹配任意大写字母。
  • [a-zA-Z0-9]:匹配任意字母和数字。
  • [!@#\$%\^&*()]:匹配任意一个特殊字符。
预定义字符类
  • .:匹配任意字符(除换行符)。
  • \d:匹配任意数字,等价于[0-9]
  • \D:匹配任意非数字,等价于[^0-9]
  • \w:匹配任意单词字符(字母、数字、下划线),等价于[a-zA-Z0-9_]
  • \W:匹配任意非单词字符,等价于[^a-zA-Z0-9_]
  • \s:匹配任意空白字符(空格、制表符、换行符)。
  • \S:匹配任意非空白字符。
数量词
  • *:匹配前面的子表达式零次或多次。
  • +:匹配前面的子表达式一次或多次。
  • ?:匹配前面的子表达式零次或一次。
  • {n}:匹配前面的子表达式恰好n次。
  • {n,}:匹配前面的子表达式至少n次。
  • {n,m}:匹配前面的子表达式至少n次,至多m次。
示例3:验证电子邮件地址
import java.util.regex.*;public class EmailValidation {public static void main(String[] args) {String email = "example@example.com";String pattern = "^[\\w-\\.]+@[\\w-\\.]+\\.[a-zA-Z]{2,}$";Pattern compiledPattern = Pattern.compile(pattern);Matcher matcher = compiledPattern.matcher(email);if (matcher.matches()) {System.out.println("Valid email address.");} else {System.out.println("Invalid email address.");}}
}
 String pattern = "^[\\w-\\.]+@[\\w-\\.]+\\.[a-zA-Z]{2,}$";
正则表达式模式解释
^:表示字符串的开始。
[\\w-\\.]+:匹配一个或多个单词字符(字母、数字、下划线)、连字符或点号。
@:匹配字符 @。
[\\w-\\.]+:匹配一个或多个单词字符(字母、数字、下划线)、连字符或点号。
\\.:匹配字符 .,需要转义。
[a-zA-Z]{2,}:匹配两个或更多的字母字符。
$:表示字符串的结束。
综上,这个正则表达式匹配的模式是 用户名@域名.顶级域名,其中:用户名可以包含字母、数字、下划线、连字符和点号。
域名可以包含字母、数字、下划线、连字符和点号。
顶级域名必须是两个或更多的字母。

 

示例4:提取数字
import java.util.regex.*;public class ExtractNumbers {public static void main(String[] args) {String input = "Order1234 shipped on 2023-01-01";String pattern = "\\d+";Pattern compiledPattern = Pattern.compile(pattern);Matcher matcher = compiledPattern.matcher(input);while (matcher.find()) {System.out.println("Found number: " + matcher.group());}}
}
/* 输出结果
Found number: 1234
Found number: 2023
Found number: 01
Found number: 01
*/

总结

正则表达式是一个强大且灵活的字符串处理工具,通过本文的介绍和示例,相信你已经掌握了正则表达式的基本知识和常见应用。在实际开发中,合理运用正则表达式,可以大大提高字符串处理的效率和代码的可读性。

希望本文对你有所帮助。如果你有任何疑问或建议,欢迎在评论区留言讨论。Happy coding!

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

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

相关文章

【深度学习】实践方法论

李宏毅深度学习笔记 优化问题 训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题? 判断方法是通过比较不同的模型来判断模型现在到底够不够大 看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络&#x…

如何使用Hugging Face Transformers为情绪分析微调BERT?

情绪分析指用于判断文本中表达的情绪的自然语言处理(NLP)技术,它是客户反馈评估、社交媒体情绪跟踪和市场研究等现代应用背后的一项重要技术。情绪可以帮助企业及其他组织评估公众意见、提供改进的客户服务,并丰富产品或服务。 BERT的全称是来自Transfo…

编译VTK静态库

编译VTK静态库遇到问题 vtkCommonCore-9.3d.lib(vtkSMPToolsAPI.obj) : error LNK2019: unresolved external symbol "public: bool __cdecl vtk::detail::smp::vtkSMPToolsImpl<1>::IsParallelScope(void)" (?IsParallelScope?$vtkSMPToolsImpl$00smpdetai…

基于深度学习的图片检索

基于深度学习的图片检索 图片检索是指在大规模图像库中&#xff0c;根据给定的查询图像或描述&#xff0c;找到与之相关的图像。基于深度学习的方法通过提取高层次特征和语义信息&#xff0c;实现了高效和准确的图片检索。 深度学习在图片检索中的优势 特征提取能力强&#…

网信办算法备案详细解读——中国人工智能监管新规

中国出台新规旨在防范人工智能的相关风险&#xff0c;且规定了从事人工智能相关业务的实体的合规义务。 要点&#xff1a; • 中华人民共和国&#xff08;中国&#xff09; 通过推出并实施如下一系列法规&#xff0c;在人工智能监管方面领先于其他司法管辖 区&#xff1a…

Spring Cloud Alibaba之限流与防护组件Sentinel

实例演示1&#xff1a;通过Sentinel实现限流 创建SentinelDemo的Maven项目&#xff0c;配置pom文件&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&…

智能化招聘管理系统的价格大概是多少?会很贵吗?

很多企业在做自己本单位的招聘的时候&#xff0c;使用的方法都是非常的原始的人工方法。这些方法虽然成本不大&#xff0c;但是给人事人员带来的工作压力是比较大的&#xff0c;因为来企业面试的人或许非常多&#xff0c;带来的简历也是比较多的。这个时候需要人事人员人工的筛…

1.变量数据类型

1.常见的字面量类型,整数,浮点数,字符串 2.注释 # , “”“”“” , todo注释 一般包括序言性注释(功能接口,数据的描述,模块功能),功能性注释(程序段的功能,语句功能,数据的状态), 3.变量 记录存储数据. 定义变量不需要指定类型 变量名称 值 变量的值是可以改变的,可重复使…

Linux源码阅读笔记07-进程管理4大常用API函数

find_get_pid find_get_pid(...)函数功能&#xff1a;根据进程编号获取对应的进程描述符&#xff0c;具体Linux内核源码对应函数设计如下&#xff1a; 获取进程描述符&#xff0c;且描述符的count1&#xff0c;表示进程多一个用户 pid_task pid_task(...)函数功能&#xff1…

vue2中的组件自定义事件

1.绑定事件: <组件 :自定义名称"方法" /> 2.调用 this.$emit(方法,参数) 3.关闭 this.$off(方法) 案例: 1.提前准备好组件 Student组件 <template><div class"student"><h1>学校名称:{{ st…

惠普笔记本双指触摸不滚屏

查看笔记本型号 一般在笔记本背面很小的字那里 进入惠普官网 笔记本、台式机、打印机、墨盒与硒鼓 | 中国惠普 (hp.com) 选择“支持”>“解决问题”>“软件与驱动程序” 选择笔记本 输入型号&#xff0c;选择操作系统 下载驱动进行完整 重启之后进行测试

Studying-代码随想录训练营day22| 回溯理论基础、77.组合、216.组合总和II、17.电话号码的字母组合

第22天&#xff0c;回溯章节开始&#xff01;一大算法难点&#xff0c;加油加油&#xff01; 回溯理论基础组合问题的剪枝操作 文档讲解&#xff1a;代码随想录回溯理论基础 视频讲解&#xff1a;回溯理论基础 回溯法也叫回溯搜索法&#xff0c;它是一种搜索&#xff0c;遍历的…

Arathi Basin (AB) PVP15

Arathi Basin &#xff08;AB&#xff09; PVP15 阿拉希盆地&#xff0c;PVP&#xff0c;15人战场

放大招了|十亿参数大模型LLMs运行功耗仅需13W,内存使用量减少90%!

矩阵乘法&#xff08;MatMul&#xff09;历来是大型语言模型&#xff08;LLMs&#xff09;总体计算成本的主导因素&#xff0c;尤其在模型向更大维度嵌入和上下文长度发展时&#xff0c;这一成本呈指数级增长。 近期有一篇刚刚发表的论文中提出的方法完全去除了矩阵乘法操作&am…

grpc学习golang版( 三、proto文件数据类型)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 文章目录 一、proto语法二、proto中的标量类型三、proto中的数组类型四、proto中的Map类型五、proto中的嵌套类型六、…

Oracle ACE夜话--和首席-总监一起跟大家谈一谈分布式数据库发展

前言 在昨日的Oracle ACE夜话中&#xff0c;和薛首席、尹总监一起聊了下当前分布式数据库的内容&#xff0c;现将分享内容又进行了相应整理&#xff0c;分享给大家&#xff0c;也希望大家多多指正。 一、自我介绍 尚雷&#xff0c;公众号【尚雷的驿站】&#xff0c;PG ACE&a…

C++项目实践学习笔记---DLL

linux守护进程 守护进程或精灵进程&#xff08;Daemon&#xff09;&#xff1a;以后台服务方式运行的进程&#xff0c;它们不占用终端&#xff08;Shell&#xff09;&#xff0c;因此不会受终端输入或其他信号&#xff08;如中断信号&#xff09;的干扰守护进程有如下特点。 &…

高性能并行计算课程论文:并行网络爬虫的设计与实现

目录 1.绪论 1.1 研究背景 1.2 研究意义 ​​​​​​​1.3 文章结构 2. 网络爬虫相关理论 ​​​​​​​2.1 URL地址格式 ​​​​​​​2.2 网页爬取策略 2.2.1 深度优先策略 2.2.2 广度优先策略 2.2.3 最佳优先策略 ​​​​​​​2.3 网页分析算法 ​​​​​​​2.3.1 正…

微软发布Phi-3系列语言模型:手机端的强大AI助手

大模型&#xff08;LLMs&#xff09;在处理复杂任务时展现出的巨大潜力&#xff0c;但却需要庞大的计算资源和存储空间&#xff0c;限制了它们在移动设备等资源受限环境中的应用。微软公司最新发布的Phi-3系列语言模型&#xff0c;以其卓越的性能和小巧的体积&#xff0c;打破了…

c++习题01-ljc的暑期兼职

目录 一&#xff0c;题目描述 二&#xff0c;思路 三&#xff0c;伪代码 四&#xff0c;流程图 五&#xff0c;代码 一&#xff0c;题目描述 二&#xff0c;思路 1&#xff0c;根据题目要求需要声明4个变量&#xff1a;a,b,c,d ;牛奶价格a&#xff0c;活动要求b&…