java基础知识——23.正则表达式

news2024/11/26 8:56:03

这篇文章我们简略的讲一下java的正则表达式

目录

1.正则表达式概述

2.正则表达式的简单匹配规则

3.正则表达式的复杂匹配规则

4.正则表达式的分组匹配规则

5.正则表达式的非贪婪匹配

6.使用正则表达式进行搜索和替换


1.正则表达式概述

首先,我们需要明确一个观点,什么是正则表达式?

正则表达式:可以定义出一个字符串的结构特征,然后我们可以利用这个特征来查找、匹配、替换一个字符串中的某些内容。

解释:其实很好理解。就比如这里有一个字符串,很复杂,但是呢,我知道一些子串或者说具体的部分内容,现在我想匹配一下这个字符串里面是否含有这些子串,或者说这个字符串是否符合我的目标格式,又或者说,我只知道一个大概的字符串特征,但是我想在一大堆字符串中查找一个有这个特征的字符串,等等等等,这些操作都是靠正则表达式来完成的

案例演示:

需求:给出字符串“3ahfget56adwnf8adba4jk5sg6wfa4dw”,现在要求将该字符串中但凡出现“数组+a”的部分全部替换为“---”

代码如下:

代码:

public class zhengzeTest {
    public static void main(String[] args) {
        String s = "3ahfget56adwnf8adba4jk5sg6wfa4dw";
        String r = s.replaceAll("\\da","--");
        System.out.println("r = "+r);

    }
}

 解析:初看很简单,再看很复杂。字符串替换,我们都会,因为有java提供的StringAPI,但是,这些替换都是将具体的内容替换为新的内容,而现在我们要求的是将“数字+a”这个内容替换为新内容,这个内容不是固定的啊,它可以是“1a”可以是“3a”,它不是固定的,这就很麻烦。这个时候就要用到正则表达式了。正则表达式的定义就是,我们定义一个字符创的结构特征,然后我们利用这个特征来对字符串进行相应的操作。所以我们就要定义一个字符串的结构特征,这个特征是“xa”,但凡符合这个特征的部分,都要被替换。这就是正则表达式的作用。

到此,我们算是初步的认识了什么是正则表达式,正则表达式有什么用,用在什么地方了。

2.正则表达式的简单匹配规则

下面来讲一下正则表达式的简单匹配规则

正则表达式的匹配规则:从左到右按规则匹配

下面就结合具体的实例来讲一下。

如果,我们编写了一个正则表达式“abc”,那么在匹配时,就只能匹配“abc”,不能匹配“Abc”或者“ab”或者“ac”

如果,我们编写了一个正则表达式“a\&c”,那么在匹配时,就只能匹配“a&c”,不能匹配“Ac”或者“ac”或者“aC”

如果,我们编写了一个正则表达式“a\u548cc”,那么在匹配时,就只能匹配“a与c”,不能匹配“A与c”或者“ac”或者“AC”。在正则表达式中,如果我们需要表示汉字,则我们需要其对应的Unicode字符

如果,我们编写了一个正则表达式“a.c”,那么在匹配时,就能匹配“a与c”或者“abc”,不能匹配“A与c”或者“ac”或者“AC”。在正则表达式中,我们用“.”来代表一个任意字符

如果,我们编写了一个正则表达式“a\dc”,那么在匹配时,就能匹配“a0c”或者“a1c”或者“a2c”,不能匹配“A与c”或者“ac”或者“AC”。在正则表达式中,我们用“\d”来代表一个任意数字

如果,我们编写了一个正则表达式“a\wc”,那么在匹配时,就能匹配“a_c”或者“abc”或者“a2c”,不能匹配“A与c”或者“ac”或者“AC”。在正则表达式中,我们用“ \w ”来代表一个任意字母,数字,下划线

如果,我们编写了一个正则表达式“a\sc”,那么在匹配时,就能匹配“a c”或者“a        c”,不能匹配“A与c”或者“ac”或者“AC”。在正则表达式中,我们用“\s”来代表一个空格或者一个Tab

如果,我们编写了一个正则表达式“a\Dc”,那么在匹配时,就能匹配“aAc”或者“a#c”,不能匹配“A2c”或者“ac”或者“AC”。在正则表达式中,我们用“\D”来代表一个非数字

如果,我们编写了一个正则表达式“a\Wc”,那么在匹配时,就能匹配“a!c”或者“a c”,不能匹配“A2c”或者“ac”或者“AC”。在正则表达式中,我们用“\W”来代表一个非数字,字母,或下划线

如果,我们编写了一个正则表达式“a\d*”,那么在匹配时,就能匹配“a12”或者“a123”,不能匹配“A c”或者“a!”。在正则表达式中,我们用“*”来代表一个任意个字符,它的作用其实就是先匹配a,然后匹配"\d",然后因为有“*”,所以就可以有任意个“\d”了

如果,我们编写了一个正则表达式“a\d+”,那么在匹配时,就能匹配“a1”或者“a12”,不能匹配“A与c”或者“a”或者“AC”。在正则表达式中,我们用“+”来表示,至少有一个+前面的正则表达式字符

如果,我们编写了一个正则表达式“a\d?”,那么在匹配时,就能匹配“a”或者“a1”,不能匹配“A与c”或者“a12”或者“AC”。在正则表达式中,我们用“?”来表示零个或者一个其前面的正则表达式字符

如果,我们编写了一个正则表达式“\d{3}”,那么在匹配时,就能匹配“123”或者“234”,不能匹配“12”或者“1234”或者“1”。在正则表达式中,我们用“{n}”来表示,应该有n个其前面的字符

如果,我们编写了一个正则表达式“\d{3,5}”,那么在匹配时,就能匹配“123”或者“2345”或者“23456”,不能匹配“12”或者“123456”或者“1”。在正则表达式中,我们用“{n,m}”来表示,应该有n-m个其前面的字符

如果,我们编写了一个正则表达式“\d{3,}”,那么在匹配时,就能匹配“123”或者“2344687”,不能匹配“12”或者“1”。在正则表达式中,我们用“{n,}”来表示,应该至少有n个其前面的字符

下面用一张表来概述一下正则表达式的匹配规则:

正则表达式规则可以匹配
A指定字符A
\u548c指定的Unicode字符
.任意字符a,b,&,0
\d0~90,1,2,……,9
\wa~z,A~Z,0~9,_a,A,0,_,……
\s空格,Tab键
\D非数字a,A,&,_,……
\W非\w&,@,中,……
\S非\s

a,A,&,_,……

AB*任意个数字符A,AB,ABB,ABBB
AB+至少1个字符AB,ABB,ABBB
AB?0个或者1个字符A,AB
AB{3}指定个数字符ABBB
AB{1,3}指定范围个数字符AB,ABB,ABBB
AB{2,}至少n个字符ABB,ABBBB,……
AB{0,3}至多n个字符A,AB,ABB,ABBB

3.正则表达式的复杂匹配规则

下面来讲一下正则表达式的复杂匹配规则

如果,我们编写了一个正则表达式“^A\d{3}$”,那么在匹配时,就能匹配“A001”或者“A999”,不能匹配“B001”或者“A0001”。在正则表达式中,我们用^和$来匹配开头和结尾

如果,我们编写了一个正则表达式“[abc]1”,那么在匹配时,就能匹配“a1”或者“b1”或者“c1”,不能匹配“B1”或者“d1”。在正则表达式中,我们用[ ] 来匹配范围内的字符

拓展:[a-f]:a,b……f;[a-f0-9]{3}:aaa,a2d,123……

如果,我们编写了一个正则表达“[^0-5]{3}”,那么在匹配时,就能匹配“789”或者“689”或者“ac8”,不能匹配“a21”或者“132”。在正则表达式中,我们用[^……]来匹配非范围内的字符

如果,我们编写了一个正则表达“AB|CD”,那么在匹配时,就能匹配“AB”或者“CD”,不能匹配“ABCD”或者“AC”。在正则表达式中,我们用“ | ”来表示选择

正则表达式规则可以匹配
^开头字符串开头
$结尾字符串结尾
[ABC][……]内任意字符A,B,C
[A-F0-9xy]指定范围的字符A……F,0-9,x,y
[^A-F]指定范围外的字符非A……F
AB|CDAB或者CDAB,CD

4.正则表达式的分组匹配规则

正则表达式的分组匹配其实就是利用()来完成的,我们只需要在正则表达式的相应位置加上()就行,就是相当于改变了一下顺序而已

5.正则表达式的非贪婪匹配

下面用一个例子来讲解一下正则表达式的贪婪匹配和非贪婪匹配

例:我们需要判断一串数字末尾0的个数

如下所示:“123000”:3个0;“12300”:2个0;“123”:0个0

我们可以的初始反应一个是需要这样写:“^(\d+)(0*)”

为什么会出现这样的结果呢?因为正则表达式默认的是贪婪匹配,就是说在匹配“^(\d+)”时,它会尽可能多的匹配,所以就会出现上面的结果

那应该怎么解决呢?使用非贪婪匹配

非贪婪匹配就是尽可能少的匹配,它是用“?”来实现的,所以为了实现上面的案例,我们的正则表达式应该为“^(\d+?)(0*)

这就是非贪婪匹配

6.使用正则表达式进行搜索和替换

使用正则表达式对字符串进行搜索和替换,其实本质上就是对StringAPI的调用。我们需要熟悉StringAPI,然后熟悉正则表达式,编写正确的正则表达式就可以啦。

在java中正则表达式并不是一个重点内容,但是大家还是要有所了解。

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

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

相关文章

leetcode 面试题 02.04. 分割链表

原题为: 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在大于或等于x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 测试示例如下: 输入:head [1,4…

Flink第一章:环境搭建

系列文章目录 Flink第一章:环境搭建 文章目录 系列文章目录前言一、Idea项目1.创建项目2.pom.依赖3.DataSet4.DataStreaming 二、环境搭建1.Standalone2.Flink on Yarn 总结 前言 Flink也是现在现在大数据技术中火爆的一门,反正大数据的热门技术学的也差不多了,啃完Flink基本…

Packet Tracer - 研究直连路由

Packet Tracer - 研究直连路由 目标 第 1 部分:研究 IPv4 直连路由 第 2 部分:研究 IPv6 直连路由 拓扑图 背景信息 本活动中的网络已配置。 您将登录路由器并使用 show 命令发现并回答以下有关直连路由的问题。 注:用户 EXEC 密码是 c…

A2B汽车音响系统开发设计与改装

hezkz17进数字音频系统研究开发答疑群 1 前装与后装

安装了Volar插件vue文件没有显示Volar的图标

vue3官网 推荐使用Volar来替换Vetur 一、安装Volar 安装Volar前&#xff1a; 安装Volar后&#xff1a; 二、安装Volar插件后&#xff0c;无法显示高亮 之前我安装Volar插件后&#xff0c;vue文件的<script>、<template>、<style>标签仍然是白色的&#xff0c…

Doris(17):动态分区

动态分区是在 Doris 0.12 版本中引入的新功能。旨在对表级别的分区实现生命周期管理(TTL)&#xff0c;减少用户的使用负担。 目前实现了动态添加分区及动态删除分区的功能。 1 原理 在某些使用场景下&#xff0c;用户会将表按照天进行分区划分&#xff0c;每天定时执行例行任…

【网课平台】Day14.集成RabbitMQ:消息队列实现异步通知

文章目录 一、需求&#xff1a;支付通知1、需求分析2、技术方案3、集成RabbitMQ4、生产端发送消息5、消费方发送消息 二、需求&#xff1a;在线学习1、需求分析2、表设计与实体类3、接口定义--查询课程4、接口定义获取视频5、Service层开发6、FeignClient定义7、代码完善 三、需…

数字设计小思 - D触发器与死缠烂打的亚稳态

前言 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中&#xff0c;D触发器是最常用的器件&#xff0c;也可以说是时序逻辑的核心&#xff0c;本文根据个人的思考历程结合相关书籍内容和网上文章&#xff0c;聊一聊D…

Hudi数据湖技术之数据中心案例实战

目录 1 案例架构2 业务数据2.1 客户信息表2.2 客户意向表2.3 客户线索表2.4 线索申诉表2.5 客户访问咨询记录表 3 Flink CDC 实时数据采集3.1 开启MySQL binlog3.2 环境准备3.3 实时采集数据3.3.1 客户信息表3.3.2 客户意向表3.3.3 客户线索表3.3.4 客户申诉表3.3.5 客户访问咨…

微信小程序 WebSocket 通信 —— 在线聊天

在Node栏目就讲到了Socket通信的内容&#xff0c;使用Node实现Socke通信&#xff0c;还使用两个流行的WebSocket 库&#xff0c;ws 和 socket.io&#xff0c;在小程序中的WebSocket接口和HTML5的WebSocket基本相同&#xff0c;可以实现浏览器与服务器之间的全双工通信。那么本篇…

SSH 服务器、NFS 服务器、TFTP 服务器详解及测试

文章目录 前言一、SSH 服务器1、SSH 能做什么&#xff1f;2、安装 SSH 服务器3、测试 SSH 服务4、用 SecureCRT 测试 二、NFS 服务器1、NFS 能做什么&#xff1f;2、安装 NFS 软件包3、添加 NFS 共享目录4、启动 NFS 服务5、测试 NFS 服务器 三、TFTP 服务器1、TFTP 能做什么&a…

轻松掌握mysql事务的四大特性ACID及实现原理

1、介绍 要实现这四大特性&#xff0c;我们先了解下mysql中的缓冲池和数据页 2、保证原子性和一致性 1、通过undo log保证数据的原子性和一致性 undo log保证了事务的原子性和一致性。 3、保证隔离性 1、并发事务产生时容易产生的隔离性问题 脏读 不可重复读 幻读…

【数据库复习】第四章数据库保护 1

数据库安全性&#xff1a; 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享 用户标识与鉴别 用户名和口令易被窃取&#xff0c;每个用户预先约定好一个计算过程或者函数 存取控制 常用存取控制方法 自主存…

电子电气架构——车辆E/E架构常识

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人只有在举棋不定,无从把握的时候才感到疲惫。只有去行动就能获得解放,哪怕做的不好也比无所作为强! 本文主要介绍车辆E/E架构常识,主要涉及E/E架构面临…

LNMP、Tomca

构建Nginx服务器 使用源码包安装nginx软件包 [rootproxy ~]# yum -y install gcc pcre-devel openssl-devel #安装依赖包 [rootproxy ~]# useradd -s /sbin/nologin nginx [rootproxy ~]# tar -xf nginx-1.17.6.tar.gz [rootproxy ~]# cd nginx-1.17.6 [rootproxy …

【Shell编程之循环语句与函数】

目录 一、for循环语句示例:示例1示例2 示例3 二、跳出循环举例 转义符三、while 语句的结构示例: 四、until语句的结构1、基本格式 五、seq命令 一、for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 #!/bin/bash for(( i0;i<5;i ))i0 定义for循环i变量初…

【逻辑位移和算数位移】

<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时&#xff0c;会将x的所有位右移x位&#xff0c;同时左边高位补0 显而易见&#xff0c;运算结束后&#xff0c;值为1 。 可知右移n位&#xff0c;结果就是 x / 2^n&#xff1a;7 / 2 ^2 1;…

运行vue项目报DONE Build complete. The dist directory is ready to be deployed.解决办法

一、问题描述 今天在运行一个vue项目时发现运行途中报这样一个错误&#xff0c;经过查阅相关资料可知&#xff0c;这是dist文件夹下 二、解决办法 根据官方文档&#xff0c;目录需要启动一个 HTTP 服务器来访问 (除非你已经将 publicPath 配置为了一个相对的值)&#xff0c;所…

flex垂直方向布局与overflow结合使用

主要是需要留意 flex布局和overflow 之间的关系&#xff0c; 最外面的container 和 里面的main-box 之间分别使用了flex布局 和 overflow:hiddenmain-box 和 里面的main-body 之间分别使用了 flex布局 和 overflow:auto 有点类似于聊天的窗口布局 <!DOCTYPE html> <h…

zabbix监控远程主机

zabbix监控远程主机 在Zabbix服务器上安装Zabbix代理程序 在远程主机上安装Zabbix代理程序。安装方式取决于操作系统&#xff0c;可以从Zabbix官网上下载相应的安装包进行安装。 监控agent1 在agent1上安装agent yum install zabbix-agent另外在zabbix server上要关闭防火…