【Java】探秘正则表达式:深度解析与精妙运用

news2024/10/24 23:59:08

目录

引言

一、基本概念

1.1 元字符

1.2 预定义字符类

1.3 边界匹配符

1.4 数量标识符

1.5 捕获与非捕获分组 

二、Java中的正则表达式支持

三、正则表达式的使用示例

3.1 匹配字符串 

3.2 替换字符串

3.3 分割字符串 

3.4 使用Pattern和Matcher

3.5 捕获组和后向引用

3.6 贪婪模式和勉强模式的对比

四、正则表达式的进阶使用

结语


引言

正则表达式(Regular Expression)是计算机科学中的一个重要概念,它是一种强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。正则表达式由普通字符(如a~z)和特殊字符(元字符)组成,用于描述在查找文字主体时待匹配的一个或多个字符串。在Java中,正则表达式通过java.util.regex包提供支持,主要包括Pattern和Matcher两个类,以及String类中的几个特殊方法。


一、基本概念

正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。


1.1 元字符

表达式含义
.匹配任意单个字符(换行符除外)
\转义字符,用于匹配特殊字符或表示特殊序列
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
{n}匹配前面的子表达式恰好n次
{n,}匹配前面的子表达式至少n次
{n,m}匹配前面的子表达式至少n次,但不超过m次
[]字符类,匹配方括号中的任意字符
|逻辑“或”操作符,匹配左右两边的表达式之一
()分组,将多个字符或表达式组合成一个子表达式,用于后续引用或操作
(?i)忽略后面字符的大小写

1.2 预定义字符类

表达式含义
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^\d]
\s匹配任何空白字符,包括空格、制表符、换页符等,等价于[\t\n\r\f\v]
\S匹配任何非空白字符,等价于[^\s]
\w匹配任何单词字符(包括字母、数字和下划线),等价于[a-zA-Z0-9_]
\W匹配任何非单词字符,等价于[^\w]

1.3 边界匹配符

表达式含义
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
\b匹配一个单词边界,即单词字符和非单词字符之间的位置
\B匹配非单词边界

1.4 数量标识符

  • 贪婪模式(Greedy):数量表示符默认采用贪婪模式,会一直匹配下去,直到无法匹配为止。
  • 勉强模式(Reluctant):用问号后缀?表示,只会匹配最少的字符,也称为最小匹配模式。
  • 占有模式(Possessive):用加号后缀+表示,目前只有Java支持占有模式,通常比较少用。

1.5 捕获与非捕获分组 

捕获分组: 

        后续还要使用本组的数据

        正则表达式内部使用:\\组号

        正则表达式外部使用:$组好

非捕获分组:

符号含义
(? : 正则)获取所有
(? = 正则)获取前面部分
(? ! 正则)获取不是指定内容的前面部分

二、Java中的正则表达式支持

Java提供了多种方式来使用正则表达式,包括String类中的方法以及Pattern和Matcher类。

  1. String类中的方法
    • boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
    • String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
    • String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
    • String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
  2. Pattern和Matcher类
    • Pattern类:用于表示编译后的正则表达式。通过调用Pattern.compile(String regex)方法,可以将一个字符串形式的正则表达式编译成一个Pattern对象。
    • Matcher类:用于对输入字符串进行匹配操作。通过调用Pattern对象的matcher(CharSequence input)方法,可以创建一个Matcher对象,然后使用该对象进行匹配操作。

三、正则表达式的使用示例


3.1 匹配字符串 

String value = "12345";  
String regex = "\\d{5}";  
boolean matches = Pattern.matches(regex, value);  
System.out.println("The Result is: " + matches); // 输出: The Result is: true

3.2 替换字符串

String s = "1324.5421";  
String s1 = s.replaceAll("[0-4]{4}\\.\\w{4}", "!");  
System.out.println(s1); // 输出: !

3.3 分割字符串 

String s = "1324.5421";  
String[] split = s.split("\\."); // 分割后数组为[1324, 5421]

3.4 使用Pattern和Matcher

String value = "12345";  
String regex = "\\d{5}";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(value);  
System.out.println("The Result is: " + matcher.matches()); // 输出: The Result is: true

3.5 捕获组和后向引用

String text = "go go";  
String regex = "\\b(\\w+)\\b\\s+\\1\\b";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(text);  
while (matcher.find()) {  
    System.out.println("Found match: " + matcher.group()); // 输出: Found match: go go  
}

3.6 贪婪模式和勉强模式的对比

String str = "hello,java!";  
// 贪婪模式的正则表达式  
System.out.println(str.replaceFirst("\\w*", "■")); // 输出: ■,java!  
// 勉强模式的正则表达式  
System.out.println(str.replaceFirst("\\w*?", "■")); // 输出: ■hello,java!

四、正则表达式的进阶使用

  1. 字符类中的范围和否定
    • [a-z]:匹配任意小写字母。
    • [A-Z]:匹配任意大写字母。
    • [0-9]:匹配任意数字。
    • [^a-z]:匹配任意非小写字母的字符。
  2. 分组和命名捕获组
    • (expression):将表达式分组,并捕获匹配的文本。
    • (?<name>expression):将表达式分组,并给捕获组命名。
  3. 零宽度断言
    • (?=exp):零宽度正预测先行断言,断言被匹配的字符串以表达式exp结尾,但不包括exp本身。
    • (?<=exp):零宽度正回顾后发断言,断言自身出现的位置前面能匹配表达式exp,但不包括exp本身。
  4. 条件表达式
    • (?(condition)yes-pattern|no-pattern):根据条件选择匹配yes-pattern或no-pattern。
  5. 正则表达式的选项
    • Pattern.CASE_INSENSITIVE:忽略大小写。
    • Pattern.MULTILINE:多行模式,使^$能够匹配输入字符串的每一行开头和结尾。
    • Pattern.DOTALL:点匹配所有字符,包括换行符。

结语

正则表达式是一种强大且灵活的字符串处理工具,在Java中得到了广泛的应用。通过掌握正则表达式的基本概念、元字符、预定义字符类、边界匹配符和数量标识符等知识点,以及Java中提供的String类方法和Pattern、Matcher类的使用方式,我们可以高效地处理各种字符串匹配、替换和分割等操作。同时,正则表达式的进阶使用技巧,如字符类中的范围和否定、分组和命名捕获组、零宽度断言和条件表达式等,也为我们提供了更强大的字符串处理能力。

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

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

相关文章

我了个超绝MATLAB——基础

由于要参加美赛&#xff0c;不想拖对队友们的后腿&#xff0c;于是一怒之下……怒了一下 创建MATLAB脚本 创建脚本 在主页——新建——脚本 中新建脚本&#xff08;Ctrln&#xff09; 保存 编辑器——保存&#xff08;Ctrls&#xff09; 运行 编辑器——运行&#xff08;F5&…

iOS--利用UITableViewDataSourcePrefetching实现平滑如丝的无限滚动

前言&#xff1a; 相信大家在网络不好的时候使用列表分页的App会获得非常不好的体验&#xff0c;由于网络的问题&#xff0c;会有明显的卡顿&#xff0c;就像抖音等App&#xff0c;那么我们是否能使用一些手段来优化这个体验呢&#xff1f;这里可以用到UITableView中另一个协议…

【案例演示】图像描述大模型示例及概念解释

【案例演示】图像描述大模型示例及概念解释 一、案例演示模型描述期望模型使用方式以及适用范围模型功能演示 二、大模型开源平台概览模型库的定义大模型开源平台 一、案例演示 模型链接&#xff1a;https://modelscope.cn/models/iic/mplug_image-captioning_coco_base_zh 模…

使用 CDN 后 Apache 的日志记录客户真实 IP

经常搭建网站服务器的都知道&#xff0c;在给站点使用了 CDN 后 Web 应用的日志记录里就会只记录 CDN 节点 IP 了&#xff0c;这就没法看到真实客户请求 IP&#xff0c;对于日志分析、运维日常维护来说就有点儿麻烦了&#xff0c;今天明月结合在五洛云服务器上搭建的Apache环境…

短视频账号矩阵系统源码---独立saas技术部署

#短视频账号矩阵系统# #短视频矩阵源码# #短视频账号矩阵系统技术开发# 抖音seo账号矩阵系统&#xff0c;短视频矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“…

liunx线程互斥

临界资源和临界区 临界资源&#xff1a;多线程执行流共享的资源就叫临界资源。 临界区&#xff1a;每个线程中&#xff0c;访问临界区的代码&#xff0c;就叫临界区。 互斥&#xff1a;任何时候&#xff0c;互斥保证只有一个执行流进入临界区&#xff0c;访问临界资源&#…

华为eNSP:端口安全

一、什么是端口安全 端口安全是指保护计算机端口免受未经授权的访问、攻击或滥用的一种措施。计算机上的每个服务或应用程序都依靠特定的端口进行通信。端口安全的目的是限制对计算机端口的访问&#xff0c;确保只有经过授权的用户或服务可以使用这些端口。通过配置防火墙、访…

C/C++(六)多态

本文将介绍C的另一个基于继承的重要且复杂的机制&#xff0c;多态。 一、多态的概念 多态&#xff0c;就是多种形态&#xff0c;通俗来说就是不同的对象去完成某个行为&#xff0c;会产生不同的状态。 多态严格意义上分为静态多态与动态多态&#xff0c;我们平常说的多态一般…

VulkanTutorial(1·环境搭建,渲染流程简述)

介绍&#xff1a; 与OpenGL&#xff0c;WebGL和Direct3D等API&#xff08;(Application Programming Interface, 应用程序编程接口)&#xff09;相比&#xff0c;valkan更偏向于底层&#xff0c;有更多的GPU控制接口&#xff0c;因此它有更好的性能和更小的驱动开销&#xff0…

【Python数据可视化】利用Matplotlib绘制美丽图表!

【Python数据可视化】利用Matplotlib绘制美丽图表&#xff01; 数据可视化是数据分析过程中的重要步骤&#xff0c;它能直观地展示数据的趋势、分布和相关性&#xff0c;帮助我们做出明智的决策。在 Python 中&#xff0c;Matplotlib 是最常用的可视化库之一&#xff0c;它功能…

【论文+源码】基于spring boot的垃圾分类网站

创建一个基于Spring Boot的垃圾分类网站涉及多个步骤&#xff0c;包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步&#xff1a;准备环境 确保您的开发环境中安装了以下工具&#xff1a; Java JDK 8 或更高版本Mav…

python装饰器的另类用法

在对pyverilog源码进行单步调试时&#xff0c;遇到一个很奇怪的现象&#xff0c;被装饰器装饰的方法t_LINECOMMENT没有主动调用&#xff0c;但装饰器TOKEN中的内嵌函数set_regex却被调用了。 ## lexer.pyfrom ply.lex import *class VerilogLexer(object):linecomment r"…

C++【string类的使用】(上)

文章目录 1. 为什么要学习string类2. 标准库的string类2.1 string的构造函数&#xff08;1&#xff09;无参构造&#xff08;重点&#xff09;&#xff08;2&#xff09;用字符串初始化&#xff08;重点&#xff09;&#xff08;3&#xff09;用字符串的前n个字符初始化(4)拷贝…

常见ElasticSearch 面试题解析(上)

前言 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。ElasticSearch…

直播间“饕餮盛宴”的背后,是“他经济”正在冒头

最近&#xff0c;一个有意思的现象逐渐露出了苗头。 今年“双11”第一轮尾款开启支付的当晚&#xff0c;罗永浩的直播间上演了一出别样的“饕餮盛宴”。直播开场后&#xff0c;iphone16系列、可口可乐&#xff08;含糖、无糖300ml&#xff09;10秒售罄&#xff0c;索尼PS5、沃…

hive on tez 指定队列后任务一直处于running状态

如上图所示一直处于running状态&#xff0c;查看日志发现一直重复弹出同一个info&#xff1a; 2024-10-18 16:57:32,739 [INFO] [AMRM Callback Handler Thread] |rm.YarnTaskSchedulerService|: Allocated: <memory:0, vCores:0> 释义: 当前应用程序没有分配到任何内存…

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

教程分享!超简单的低功耗4G模组LCD应用示例!看过来~

低功耗4G模组LCD应用是物联网技术中的一部分知识&#xff0c;在未来的学习和实践中&#xff0c;我们还将接触到更多前沿的技术和理念。让我们一起努力&#xff0c;探索科技的无限可能&#xff0c;为我们的生活带来更多便利与惊喜&#xff01;希望本文能为您提供一些帮助&#x…

Cisco WLC 9800 - HA SSO with Ether-channel

本文将记录如何配置HA SSO以及Ethernet Channel。 1.拓扑情况 本文的内容基于如下的Topo进行。 2.准备工作 两台WLC的型号必须一样&#xff1b;两台WLC必须使用一样的软件版本&#xff1b;需要准备好使用的IP地址&#xff1a;两个用于WLC的管理地址&#xff08;WMI&#xff…

串口通讯编程示例之串口编写程序

使用open()函数打开串口设备 首先使用open()函数打开串口设备/dev/ttymxc6&#xff0c;设备使用了O_RDWR | O_NOCTTY | O_NDELAY标志&#xff0c;分别代表以读写方式打开、不让设备成为控制终端且设置非阻塞模式&#xff0c;也就是当无法打开设备时&#xff0c;不会在原地等待&…