正则表达式(Java)

news2024/10/7 12:20:44

定义

正则表达式(Regular Expression)是一种文本模式匹配的工具,可以用来搜索、替换或提取文本中的模式。它可以用来检查文本是否符合某种模式,或者从文本中提取出符合某种模式的部分

一般用法

未分组

public static void main(String[] args) {
        String str = "1234i的风格送佛i给1352是对方能够普诺斯123 当时法国境内官服4567";
        String regStr = "\\d\\d\\d\\d";
        //创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        //创建匹配器
        Matcher matcher = pattern.matcher(str);
        //开始匹配
        /**
         * matcher.find()
         * 1. 定位满足规则的字符串
         * 2. 找到后,将子字符串的索引记录到matcher对象的属性int[] groups
         *    groups[0]记录第一个子字符串开始的索引,在本例是0,groups[1]记录子字符串结束的索引+1,在本例是4
         * 3. 同时将子字符串结束的索引+1的值记录在oldList中下次执行find方法时,就从该位置开始匹配,在本例是4
         * 4. 重复以上规则
         */
        /**
         * matcher.group(0)
         * 返回找到的子字符串
         */
        while (matcher.find()) {
            System.out.println(matcher.group(0));
        }
    }

分组

正则表达式使用 () 分组,比如 (\d\d)(\d\d),分成了两组

public static void main(String[] args) {
        String str = "1234i的风格送佛i给1352是对方能够普诺斯123 当时法国境内官服4567";
        String regStr = "(\\d\\d)(\\d\\d)";
        //创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        //创建匹配器
        Matcher matcher = pattern.matcher(str);
        //开始匹配
        /**
         * matcher.find()
         * 1. 定位满足规则的字符串,比如(12)(34)
         * 2. 找到后,将子字符串的索引记录到matcher对象的属性int[] groups
         *      2.1 groups[0] = 0 , 把该子字符串的结束的索引+1 的值记录到 groups[1] = 4
         *      2.2 记录 1 组()匹配到的字符串 groups[2] = 0 groups[3] = 2
         *      2.3 记录 2 组()匹配到的字符串 groups[4] = 2 groups[5] = 4
         *      2.4.如果有更多的分组....
         * 3. 同时将子字符串结束的索引+1的值记录在oldList中下次执行find方法时,就从该位置开始匹配,在本例是4
         * 4. 重复以上规则
         */
        /**
         * matcher.group()
         * 返回找到的子字符串
         */
        while (matcher.find()) {
            /**
             * matcher.group(0):表示匹配整个子字符串
             * matcher.group(1):表示匹配整个子字符串的第一个分组
             */
            System.out.println(matcher.group(0));
            System.out.println("第一组数据:" + matcher.group(1));
            System.out.println("第二组数据:" + matcher.group(2));
        }
​
    }

语法

转义字符- \\

需要用到转义字符的有:

 

字符匹配符

 

\\w 也可以找到下划线 _

\\s 匹配任何空白字符(空格,制表符等)
String regStr = "\\s";
\\S 匹配任何非空白字符 ,和\\s 刚好相反
String regStr = "\\S";
. 匹配出 \n 之外的所有的单个字符,如果要匹配.本身则需要使用 \\. 
String regStr = "\\.";
String regStr = ".";

不区分大小写方案

  • (?!) 在其之后的字符不区分大小写

    1. (?i)abc表示abc不区分大小写

    2. a(?i)bc表示bc不区分大小写

    3. a()(?i)b)c表示b不区分大小写

  • 创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写

    Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);

示例

String regStr = "[a-z]";//匹配 a-z 之间任意一个字符
String regStr = "abc";//匹配 abc 字符串[默认区分大小写]
String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]
String regStr = "[0-9]";//匹配 0-9 之间任意一个字符
String regStr = "[^a-z]";//匹配 不在 a-z 之间任意一个字符
String regStr = "[abcd]";//匹配 在 abcd 中任意一个字符
String regStr = "\\D";//匹配 不在 0-9 的任意一个字符
String regStr = "\\W";//匹配 等价于 [^a-zA-Z0-9_]

选择匹配符

| 匹配符号两边的表达式

String regStr = "[123]|[abc]";

限定符

用于指定其前面的字符或组合项连续出现多少次,Java默认贪婪匹配(尽可能多匹配)

符号含义实例说明匹配的字符串
*指定字符重复0次或n次(ab)*包含任意个ab的字符串ab,ababab
+指定字符重复1次或n次,至少一次abc+以ab开头的以至少一个c结尾的字符串abc,abccc
?指定字符重复0次或1次ab?a或aba,ab
{n}指定字符重复n次ab{2}a加上2个babb
{n,}指定字符至少重复n次ab{2,}abb,abbbb
{n,m}指定字符至少重复n次最多m次ab{2,3}abb,abbb

定位符

规定匹配的字符串出现的位置,比如开始或结束的位置,正对原字符串

符号含义实例说明匹配的字符串
^指定原字符串起始字符^[0-9]+[a-z]*至少一个数字开头的、与任意个小写字母相连的字符串1fhgd,45dd
$指定原字符串结束字符^[0-9]\\-[a-z]+$以一个数字和-开头的、与任意个小写字母结尾的字符串1-as
\\b匹配原字符串的边界的尾部zzp\\b边界是指原字符串的空格和结束的位置vczzp jdzzp
\\B和\\b相反zzp\\B和\\b相反zzp123 zzp123

分组

捕获分组

构造形式说明
(pattern)非命名捕获,编号为零时整个子字符串,其他分组从1开始编号
(?<name>pattern)/(?'name'pattern)命名捕获,可以使用编号或名称来获取分组,name不能包含标点符号,不能以数字开头

非捕获分组

匹配pattern但不捕获该匹配的字符串

构造形式说明
(?:pattern)适用于I或or的情形,如zzp1|zzp2==zzp(?:1|2)
(?=pattern)zzp(?=1|2)可以匹配zzp1和zzp2中的zzp,而不能匹配zzp3中的zzp
(?!pattern)与上个相反

非贪婪匹配

Java正则表达式默认是贪婪匹配,在其他限定符(*、+、?、{*n*}、{*n*,}、{*n*,*m*})之后添加 ? 时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"

正则表达式三个常用类

java.util.regex包主要包括三个类:Matcher,Pattern, PatternSyntaxException

  • Pattern

    pattern是一个正则表达式对象,没有公共的构造方法,需要创建对象时,使用其静态方法

    它的方法matches可以用于整体匹配

    public static boolean matches(String regex, CharSequence input) 
    Pattern.matches("zzp.*","zzp123")

 

 

反向引用

圆括号的内容被捕获后可以在之后被使用,叫做反向引用,既可以在正则表达式的内部使用也可以在外部使用

内部反向引用 \\分组号,外部反向引用 $分组号

连续两个相同的数字
String regStr = "(\\d)\\1";
连续五个相同的数字
String regStr = "(\\d)\\1{5}";
一个首尾相同的、中间两个也相同的数字
String regStr = "(\\d)(\\d)\\2\\1";
外部的反向引用,用第一个分组替换匹配到的字符串
content = matcher.replaceAll("$1");

String类中的正则表达式

替换功能

String 类 public String replaceAll(String regex,String replacement)
String str = "zzp12453456";
str = str.replaceAll("z|p", "o");

判断功能

String 类 public boolean matches(String regex){}	//属于整体匹配
String str = "zzp123456";
System.out.println(str.matches("zzp.+"));

分割功能

String 类 public String[] split(String regex)
String str = "zzp123dfnj45s df6dsf";
String[] strings = str.split(" |\\d+");

样例

汉字
String regStr = "^[\u0391-\uffe5]+$"

邮政编码 要求:1.是 1-9 开头的一个六位数. 比如:123890 
String regStr = "^[1-9]\\d{5}$"

QQ 号码 // 要求: 是 1-9 开头的一个(5 位数-10 位数) 比如: 12389 , 1345687 
String regStr = "^[1-9]\\d{4,9}$"

手机号码 // 要求: 必须以 13,14,15,18 开头的 11 位数 , 比如 13588889999 
String regStr = "^1[3|4|5|8]\\d{9}$"
    
URL
String regStr = "^((http|https)://)?([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$";//注意:[. ? *]表示匹配就是.?*本身

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

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

相关文章

php+vue加油站会员服务系统 java微信小程序

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 3.2网站性能需求分析 10 3.3网站功能分析 10 3.4系统…

九龙证券|市场化转融资业务试点上线首日平稳运行

2月21日&#xff0c;中国证券金融股份有限公司&#xff08;下称“中证金融”&#xff09;商场化转融资事务试点迎来首个买卖日。全天该事务试点平稳运转&#xff0c;商场化转融资规模合计10亿元。 业内人士以为&#xff0c;商场化转融资事务形式下&#xff0c;证券公司参加转融…

Docker之路(2.Docker详细安装、使用阿里云镜像加速、卸载)

1.安装Docker 1.1 确定Linux环境系统信息 我这里使用的是阿里云的云服务器系统内核是3.10以上的 # 查看系统内核版本 uname -aLinux版本信息 # 查看系统版本信息 cat /etc/os-release1.2 安装 官方安装帮助文档 https://docs.docker.com/engine/install/centos/ 这块看文档…

【Redis】网络模型:Redis的IO多路复用

【Redis】网络模型&#xff1a;Redis的IO多路复用 文章目录【Redis】网络模型&#xff1a;Redis的IO多路复用一、用户空间和内核态空间二、IO模型1、阻塞IO2、非阻塞IO3、IO多路复用4、异步IO5、信号驱动IO六、对比三、IO多路复用1、IO多路复用-select方式2、IO多路复用模型-po…

opencv-StereoBM算法流程(二)

OpenCV BM对于处理非畸变的立体图像, 主要有以下 3 个步骤:1. 预处理滤波: 使图像亮度归一化并加强图像纹理2. 立体匹配: 沿着水平极线用 SAD 窗口进行匹配搜索3. 再滤波: 去除坏的匹配点.匹配之后, 如果左右视差检查使能了 disp12MaxDiff > 0, 还有使用cv::validateDispari…

【服务器数据恢复】raid5阵列2块硬盘先后离线的数据恢复案例

服务器数据恢复环境&#xff1a; 华为s系列服务器&#xff1b; 24块硬盘组成一组raid5磁盘阵列&#xff0c;其中包含1块热备盘。 服务器故障&检测&#xff1a; 服务器工作状态下raid5中有一块硬盘离线&#xff0c;热备盘激活替换离线硬盘并开始进行数据同步&#xff0c;在同…

(二十一)、实现评论功能(1)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;评论回复模块的样式布局 1.1 在detail页面添加uview中的 Empty 内容为空组件 <!-- 评论区 --><view class"comment"><u-empty mode"comment" icon"http://cdn.uviewui.com/uview/empty/comment.png"></u-emp…

大厂面试官在校招面试中爱问啥?

如果你在简历中写了这句话&#xff0c;保证能拿到大厂面试机会&#xff1a;扎实的计算机基础&#xff0c;良好的数据结构与算法功底。 然后&#xff0c;你就会被问到头皮发麻。 虽然是段子&#xff0c;但也一定程度上说明了大厂非常注重计算机基础&#xff0c;也是真的喜欢问…

左耳听风——笔记四:分布式

左耳听风&#xff1a;分布式 分布式系统介绍 分布式系统和单体系统 使用分布式系统主要有两方面原因。 增大系统容量。我们的业务量越来越大&#xff0c;而要能应对越来越大的业务量&#xff0c;一台机器的性能已经无法满足了&#xff0c;我们需要多台机器才能应对大规模的…

【C语言进阶】指针进阶的详细讲解--(数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.字符指针&#xf…

stm32f407探索者开发板(二十)——独立看门狗实验

文章目录一、独立看门狗概述1.1 独立看门狗二、常用寄存器和库函数配置2.1 独立看门狗框图2.2 键值寄存器IWDG_KR2.3 预分频寄存器IWDG_PR2.4 重装载寄存器IWDG_RLR2.5 状态寄存器IWDG_SR2.6 IWDG独立看门狗操作库函数三、手写独立看门狗实验3.1 操作步骤3.2 iwdg.c3.3 iwdg.h3…

论文阅读-SegNeXt: 重新思考基于卷积注意力的语义分割

论文信息 论文名称&#xff1a;SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation 项目GitHub&#xff1a; GitHub - Visual-Attention-Network/SegNeXt: Official Pytorch implementations for "SegNeXt: Rethinking Convolutional Atten…

知识点滴 - 自行车分类

旅行车 旅行自行车&#xff08;Touring bicycle&#xff09;由公路自行车发展而来&#xff0c;适合超远程自给自足的旅行&#xff0c;有较舒适放松的车架几何设计&#xff0c;能够负重&#xff0c;有很低的最低档位&#xff0c;配件选择方面追求可靠耐用。 专业的长途旅行车均以…

pytorch中padding应用总结

卷积操作作为卷积神经网络的核心模块&#xff0c;在其计算过程中必须考虑图像“边缘像素”的卷积方式。查阅资料发现&#xff0c;我们可以采用“卷积之前进行边界填充”或“卷积之后进行边界填充两种方式”&#xff0c;同时边界填充的具体手段包含常量填充、零填充、镜像填充以…

大数据处理学习笔记1.3 使用Scala集成开发环境

文章目录零、本讲学习目标一、搭建Scala的IntelliJ IDEA开发环境&#xff08;一&#xff09;启动IDEA&#xff08;二&#xff09;安装Scala插件&#xff08;三&#xff09;配置IDEA使用的默认JDK&#xff08;四&#xff09;创建Scala项目1、创建Scala项目 - ScalaDemo2、创建Sc…

求选择最少的区间数目可以覆盖连续区间 [0,n]:跳跃游戏,视频拼接,灌溉花园的最少水龙头数目

选择最少区间数目覆盖区间。 贪心方法 假设有一个人想过桥&#xff0c;0 和 n 分别是河的两岸&#xff0c;一开始&#xff0c;人在 0 给你一些小区间&#xff0c;我们把这些区间视作桥。一开始我们肯定要选择包含 0 的区间&#xff0c;且要保证尽可能走得远。假如我们已经走到…

解析Java中的class文件

解析class文件需要把class文件当成文件流来处理&#xff0c;定义ClassReader结构体 type ClassReader struct {data []byte }go语言中的reslice语法可以跳过已经读过的数据。 同时定义了ClassFile数据结构来描述class文件的各个部分&#xff0c;该数据结构如下所示&#xff1…

Scala流程控制(第四章:分支控制、嵌套分支、switch分支、for循环控制全、while与do~while、多重与中断)

文章目录第 4 章 流程控制4.1 分支控制 if-else4.1.1 单分支4.1.2 双分支4.1.3 多分支4.2 嵌套分支4.3 Switch 分支结构4.4 For 循环控制4.4.1 范围数据循环&#xff08;To&#xff09;4.4.2 范围数据循环&#xff08;Until&#xff09;4.4.3 循环守卫4.4.4 循环步长4.4.5 嵌套…

华为OD机试 - 最小传递延迟(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

户外跑步用什么耳机,最适合跑步用蓝牙耳机推荐

户外运动使用的蓝牙耳机&#xff0c;耳机在佩戴时需要考虑出行安全&#xff0c;耳机完全封闭耳道的耳机&#xff0c;会让我们对周围的情况不能及时做出反应&#xff0c;造成不必要的安全事故。如果在运动当中还不知道选择哪一些运动蓝牙耳机&#xff0c;可以看看下面这些分享~ …