Java 正则基础

本文里简单的记录了一下Java正则的内容,因为之前学了python版的,所以零基础的可以去看一下视频:正则专题。而且没有列出正则里的其他方法,需要的可以百度一下

快速入门

class RegExp {public static void main(String[] args) {String content = "sdfja东方红2001都是你的sdjs1998dfSDK200djfsd2024";// 目标:匹配content里所有的四位连续数字// 1。\\d表示一个任意的数字String regStr = "\\d\\d\\d\\d";// 2.创建模式对象【即正则表达式对象】Pattern pattern = Pattern.compile(regStr);// 3.创建匹配器// 创建匹配器matcher,按照正则表达式的规则 去匹配 content字符串Matcher matcher = pattern.matcher(content);// 4.开始匹配while (matcher.find()) {System.out.println("找到:" + matcher.group(0));}}
}

正则底层实现

代码中的解析部分可以自己debug进行验证

class RegExp {public static void main(String[] args) {String content = "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了" +"第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型" +"版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的" +"标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应" +"用3443于基于Java的应用服务器。Java2平台的发布,是Java发展过程中最重要的一个" +"里程碑,标志着Java的应用开始普及9889";// 目标:匹配content里所有的四位连续数字// 1。\\d表示一个任意的数字String regStr = "\\d\\d\\d\\d";// 2.创建模式对象【即正则表达式对象】Pattern pattern = Pattern.compile(regStr);// 3.创建匹配器// 创建匹配器matcher,按照正则表达式的规则 去匹配 content字符串Matcher matcher = pattern.matcher(content);// 4.开始匹配/*** 对下面两个方法的源码进行分析* matcher.find() 完成的任务:* 1.根据指定的规则pattern(这里是要求四位连续数字\\d\\d\\d\\d),* 定位满足规则的子字符串(比如1998)* 2.找到后,将子字符串的起始索引记录到matcher对象的属性 int[] groups; 中,即groups[0]=0,* 把该子字符串的结束索引+1的值也记录到groups属性中,即 groups[1] = 4* 3.同时记录oldLast 属性的值为 子字符串的结束索引+1的值,即oldLast=4,* 下次执行find()方法时,就从oldLast开始匹配* * matcher.group()方法* 通过查看matcher.group()方法的源码可以知道* matcher.group(0)就是根据 groups[o]=0 和 groups[1]=4 的记录的位置,* 从content开始截取子字符串返回,就是[0, 4)包含0但是不包含索引为4的位置*//*** matcher.group()方法既然能传入一个0,也可以传入其他数字,但是传入其他数字是有前提的* 那就是只有匹配规则中涉及到分组时才可以传入0以外的数字,表示的是第几个分组* * 假如把regStr改为 "(\\d\\d)(\\d\\d)", 即String regStr = "(\\d\\d)(\\d\\d)";* 就表示有两个分组,一对小括号就代表一个分组* * 那么此时第一次进入while循环* find()方法* 1.根据指定的规则pattern((\\d\\d)(\\d\\d)),定位到第一个满足规则的子字符串1998* 2.找到后,把1998这个子字符串的起始索引和结束索引+1记录到groups数组中,* 即groups[0]=0, groups[1] = 3 + 1 = 4* 把第一个分组19的起始索引(0)和结束索引加1(1+1=2)也记录到groups数组中* 即groups[2]=0, groups[3] = 2* 把第二个分组98的起始索引(2)和结束索引加1(3+1=4)也记录到groups数组中* 即groups[4]=2, groups[5] = 4* 如果还有第三个、第四个...分组,依次记录到groups的6,7,8,9...的位置* 3.同时记录oldLast 属性的值为 子字符串的结束索引+1的值,即oldLast=4,* 下次执行find()方法时,就从oldLast开始匹配* * matcher.group()方法* 运行matcher.group(0)返回的就是1998,* 运行matcher.group(1)返回的就是第一个分组19* 运行matcher.group(2)返回的就是第二个分组98,如果还有更多分组,可以传入3,4,5...等* 第二次进入while循环* find()方法* 1.根据指定的规则定位到第二个满足规则的子字符串1999* 2.找到后,把1999这个子字符串的起始索引和结束索引+1记录到groups数组中,* 即groups[0]=31, groups[1] = 34 + 1 = 35* 把第一个分组19的起始索引(31)和结束索引加1(32+1=33)也记录到groups数组中* 即groups[2]=31, groups[3] = 33* 把第二个分组99的起始索引(33)和结束索引加1(34+1=35)也记录到groups数组中* 即groups[4]=33, groups[5] = 35* 如果还有第三个、第四个...分组,依次记录到groups的6,7,8,9...的位置* 3.同时记录oldLast 属性的值为 子字符串的结束索引+1的值,即oldLast=35,* 下次执行find()方法时,就从oldLast开始匹配* * matcher.group()方法,看源码可知* 运行matcher.group(0)返回的就是1999,* 运行matcher.group(1)返回的就是第一个分组19* 运行matcher.group(2)返回的就是第二个分组99,如果还有更多分组,可以传入3,4,5...等* * 再循环重复上述过程*/while (matcher.find()) {System.out.println("找到:" + matcher.group(0));}}
}

Java正则不区分大小写

java正则表达式默认是区分字母大小写的,以下写法可以实现不区分大小写:

  • (?i)abc表示abc都不区分大小写
  • a(?i)bc表示bc不区分大小写
  • a((?i)b)c表示只有b不区分大小写
  • Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);

元字符

  • 转义符\\:当需要使用正则去匹配某些特殊字符时,需要对这些特殊字符进行转义,否则编译报错.。比如需要匹配小括号(,就需要写成\\(

常见的特殊字符有:.*()+/\$?[]^{}

  • 限定符:用于指定其前面的字符和组合项连续出现多少次

  • 选择匹配符|:在匹配某个字符串的时候是选择性的,即既可以匹配这个,又可以匹配那个,这时需要用到选择匹配符号|

  • 字符匹配符

在中括号[]里的字符表示的都是字符本身的含义,不再是限定符,比如[?.]中的问号和点,都表示是个问号和点本身,即在中括号里不需要转义符进行转义。

  • 定位符:规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置

分组、捕获、反向引用

分组和捕获

分组:可以用小括号组成一个比较复杂的匹配模式,那么一个小括号的部分我们可以看作是一个子表达式/一个分组。

捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式。

  • 捕获分组

  • 非捕获分组:见视频非捕获分组

反向引用

小括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test {public static void main(String[] args) throws InterruptedException {String content = "11 21 33333 1991 2000";// 1.要匹配两个连续的相同数字 =>(\\d)\\1String regStr1 = "(\\d)\\1";Pattern compile1 = Pattern.compile(regStr1);Matcher matcher1 = compile1.matcher(content);if (matcher1.find()) {System.out.println("问题1:" + matcher1.group(0));}// 2.要匹配五个连续的相同数字 => (\\d)\\1{4}等价于 (\\d)\\1\\1\\1\\1String regStr2 = "(\\d)\\1{4}";Pattern compile2 = Pattern.compile(regStr2);Matcher matcher2 = compile2.matcher(content);if (matcher2.find()) {System.out.println("问题2:" + matcher2.group(0));}// 3.要匹配个位与千位相同,十位与百位相同的数5225,1551 => (\\d)(\\d)\\2\\1String regStr3 = "(\\d)(\\d)\\2\\1";Pattern compile3 = Pattern.compile(regStr3);Matcher matcher3 = compile3.matcher(content);while (matcher3.find()) {System.out.println("问题2:" + matcher3.group(0));}// 把类似“我...我要...学学学学...Java编程” 通过正则表达式修改成“我要学Java编程"content = "我...我要...学学学学...Java编程";// 1.先去掉所有的...content = Pattern.compile("\\.*").matcher(content).replaceAll("");System.out.println("去掉...之后:" + content);// 2.匹配出所有重复的文字// (.)\\1+ 中,.表示匹配任意一个字符,然后用反向引用查看.匹配的字符是否重复Matcher matcher = Pattern.compile("(.)\\1+").matcher(content);while (matcher.find()) {// 分别打印出我我和学学学学System.out.println("重复的文字有:" + matcher.group(0));}// 3.去重content = matcher.replaceAll("$1");System.out.println(content);}
}

非贪婪匹配

Java正则默认是贪婪匹配的,如果想要实现非贪婪匹配,只需要在其他限定符后加英文问号

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

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

相关文章

std::bind绑定普通函数、模板、类成员函数、类模板函数测试和简单策略

绑定普通函数 绑定具体值 代码 #include <iostream> #include <vector> #include <cassert> #include <functional> using namespace std;int add_func(int a, int b) {return a b; }int main() {auto func std::bind(add_func, 5, 10);cout <…

在区块链技术中,什么是工作量证明(PoW)?

工作量证明&#xff08;Proof - of - Work&#xff0c;PoW&#xff09;是区块链网络中的一种共识机制。它是一种用于验证节点是否为区块链的维护和扩展付出了足够计算资源&#xff08;即工作量&#xff09;的方法。通过让节点完成一个具有一定难度的计算任务&#xff0c;来竞争…

CentOS 7 软件/程序安装示例

安装软件/程序 wget&#xff0c;前提需要用 root 用户 1、搜索软件/程序 yum search wget 搜索到软件/程序。 2、安装软件/程序 yum -y install wget 安装完成。

USB协议学习

文章目录 USB发展背景发展变化速度等级通讯接口 四种传输主设备 & 从设备主设备从设备 连接与检测高速设备与主机连接USB总线常见的几种状态 枚举过程特点 控制传输学习资料 USB发展背景 发展变化 USB1.1&#xff1a;规范了USB低全速传输&#xff1b; USB2.0&#xff1a;…

qt QRadioButton详解

QRadioButton 是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的选项按钮。单选按钮通常呈现给用户一个“多选一”的选择&#xff0c;即在一组单选按钮中&#xff0c;一次只能选中一个按钮。 重要方法 QRadioButton(QWidget…

内核——全局句柄表

实验环境&#xff1a;win7 x32 首先引入一段基础概念&#xff1b; 1.在windows下所有的资源都是用对象的方式进行管理的(文件、进程、设备等都是对象)&#xff0c;当要访问一个对象时&#xff0c;如打开一个文件&#xff0c;系统就会创建一个对象句柄&#xff0c;通过这个句柄…

windows系统类似于linux的nohup命令后台启动jar服务

一、首先新建一个后缀名为.bat文件 二、将jar包放在与jar包同一个路径下 三、编写.bat文件 echo off start javaw -Xms512m -Xmx1024m -XX:PermSize256m -XX:MaxPermSize512m -XX:MaxNewSize512m -jar xxxxx-22900.jar >> StartupLog.log 2>&1 & exit 四…

PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置

在工作中&#xff0c;碰到PC端类似聊天框&#xff0c;鼠标向上滚动&#xff0c;触顶时分页获取数据&#xff1b;但是将接口获得的数据连接到循环数组数据前面时&#xff0c;由于数据变化&#xff0c;滚动条会直接滚动到最顶端&#xff0c;显然这个效果不友好。最好的效果就是&a…

随着飞行汽车的亮相,在环保方面有什么保护措施吗

飞行汽车具备环保潜力&#xff0c;采用电动或混合动力系统减少污染&#xff0c;并拓展应用场景。多家企业布局&#xff0c;沃飞长空作为国内eVTOL(电动垂直起降航空器)研发的领先企业&#xff0c;在环保这一点做的非常到位&#xff0c;AE200采用纯电动力系统,零碳排放,静默飞行…

【Excel】常用公式记录

这里写自定义目录标题 根据身份证号获取年龄 根据身份证号获取年龄 替换公式中的 A2 TEXT(SUMPRODUCT(DATEDIF(TEXT(IF(LEN(A2)15,19,0)&MID(A2,7,LEN(A2)/2-1),“#0-00-00”),NOW(),{“y”,“ym”,“md”})*{10000,100,1}),“00岁零00个月零00天”)

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 云直播服务-》鉴权直播 -》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后&#xff0c;没关闭应用的情况下&#xff0c;再次使用deeplink会失效的问题&#xff0c;是系统bug导致的。此bug仅在某些设备&#xff08;Nexus 5X&#xff09;上重现&#xff0c;launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

人工智能能改变哪些行业?深入分析应用场景与前景

人工智能&#xff08;AI&#xff09;技术的发展历程可追溯到20世纪50年代。最初&#xff0c;AI的概念是由计算机科学家阿兰图灵提出的&#xff0c;他设想了一种能够模拟人类思维的机器。随后&#xff0c;在1956年的达特茅斯会议上&#xff0c;人工智能作为一门独立学科正式诞生…

【缓存与加速技术实践】Redis数据类型

文章目录 Redis 数据类型String 数据类型List 数据类型Hash 数据类型Set 数据类型Sorted Set 数据类型 Redis 数据类型 Redis支持五种主要的数据类型&#xff1a; String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Hash&#xff08;散列&#xff09;…

【java】以<内存图>的形式理解数组的增删

数组 数组在内存里地址连续 定义一个数组&#xff0c;数组中的数据类型一样(二进制串位数相同)&#xff0c;故可以直接通过下标获取数组中的内容。 基本类型存的是值&#xff0c;引用类型存的是地址 数组的下标从0开始。 初始值&#xff1a; Int &#xff1a;0 char &am…

Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置

在开始开发 Swift 应用之前&#xff0c;了解 Swift 语言的背景和设置开发环境非常重要。接下来&#xff0c;我们将逐步介绍 Swift 的基本概念&#xff0c;并带你完成开发环境的安装和项目创建。 1.1 Swift 简介 Swift 是由 Apple 开发的一种现代化编程语言&#xff0c;于 201…

时代变了!Megabit兆比特英伟达纳入道琼斯指数,英特尔被取代

△英特尔VS英伟达市值对比(截至今年2月) 最新消息,英伟达将在2024年11月8日替代英特尔成为道琼斯工业平均指数的组成成员。 Megabit兆比特自成立以来,Megabit凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 这是历史最悠久的美…

算法竞赛(Python)-大事化小,小事化了(分治)

文章目录 前言一、数乘型分治1 疯狂的细胞分裂 二 矩阵乘法的分治1 神秘数字 三 、线性结构问题的分治1 自助餐厅&#xff08;1&#xff09;2 自助餐厅&#xff08;2&#xff09; 四 、树形结构的分治1 二叉树的最大深度 前言 分治思想&#xff1a;将一个大问题分词几个小问题&…

React.js教程:从JSX到Redux的全面解析

文章目录 介绍react脚手架jsx语法和react组件jsx的基本语法jsx的行内样式jsx的类名classNameif条件渲染map循环渲染创建组件方法 可视区渲染 (React- virtualized)React-redux 介绍 javascript库&#xff0c;起源于Facebook的内部项目&#xff0c;类似于vue特点 声明式组件化 …

使用Jupyter Notebook进行数据科学项目

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…