万事万物皆正则 -- Java正则表达

2023-11-05 16:40

本文主要是介绍万事万物皆正则 -- Java正则表达,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:吹逼前言

正则表达式是很多Javer自动忽略的知识点,不可否认具备一定的难度,并且在线正则生成的开源也催化了这种现象的普遍性。前段时间偶然听说一则新闻某知名IT大神吐槽不会正则的程序员不配称呼程序员,正则表达式的运用场景属实在编程中广泛存在。不求精通,但求略懂。至少需要达到当遇到一个不是很复杂正则我们可以进行解析,编辑正则还是在线生成吧。开源还是存在一定逻辑,手撸正则谁知道是什么情况

二:Java支持

Java在JDK1.4增加了对正则表达式的支持,也就是java.util.regex包,下面常用的两个类为Patter与Matcher。Patter负责解析正则表达式,Matcher负责将字符与表达式进行匹配。其中Patter未提供public的构造函数,依赖方法compile()返回对象实例,Matcher对象实例依靠Patter类matcher()返回,简易操作示例如下:
在这里插入图片描述
需要注意一点就是目前Java中字符串的匹配还是交给String类的matches()方法完成,不必进行如此复杂的操作。查看String类的该方法源码如下,发现还是调用Patter类的静态方法matches()
在这里插入图片描述

三:基础规则

因为本文是根据Java基础进行讲解,需要注意特别的一点。总所周知".“在正则中匹配所有单字符出\n外,如果想让其表示一般文本语义,则需要使用转义符号”\"。注意这个转义符号在Java中也需要使用"\“进行转义,也就是最后的呈现方式为”\\."

3.1 限定符

限定符也就是限制给定组件可以出现的次数,注意限定符必须出现在普通字符或非打印字符之后,也就是不能单独出现,且限定符只能限制前一个字符的范围

符号含义
?0或者1个字符
*0或者多个字符
+1或者无数个字符
{m,n}最少m个,最多n个,n为空代表无数多

在这里插入图片描述
解释一下什么叫限制前一个字符,如下示例。限定符{3,4}只是限制字符b出现的次数,而不能限制a,那么a还是只能出现这一次。所以最后结果为false
在这里插入图片描述

3.2 一组字符

在这里插入图片描述
想要让某个位置出现很多种情况,例如可能是1、2、5、a、A怎么办?如上所示,这时候使用中括号“[]“”表示一组字符

3.3 数字元字符

在这里插入图片描述
如果想要表达一个字符是数字,可以采取的方式有如下几种,注意其中的"-“不在”[]"中只能表示普通字符,不能表示范围:

  • [0-9]:表示数字0-9都可以匹配
  • \d:等同于[0-9]
  • \D:表示非数字,与前两者相反
3.4 字母元字符

在这里插入图片描述
如果想要表达一个字符为字母,那么就有如下几种方式,与数字元字符规则类似:

  • [a-z]:表示a-z的小写字母
  • [A-Z]:表示A-Z的大小字母
  • [a-zA-Z]:表示大写字母与小写字母
3.5 字母或数字或 _

在这里插入图片描述
表示数字可以使用\d进行简写表示,那么如果表示大小写字母、数字、下划线_可不可以有简写呢?肯定有的,如下所示:

  • \w:等同于[a-z0-9A-Z]
  • \W:与上述\w取反
3.6 取反、或

或操作就是要么是你要么是我,同或运算语义一致,使用符号"|“表示
在这里插入图片描述
取反顾名思义就是杠精,使用尖括号”^“表达内心不要的纯粹想法,注意这个取非的语义是在中括号”[]"中使用才具备,其它地方使用表示语义下面讲解。同时注意这个取反是针对中括号内部全部取反在这里插入图片描述

3.7 组划分

整个正则表达式可能是多个子级表达式组成,比如最开始讲到的匹配年-月-日就是由多个子表达式构成最后的正则表达式。如果需要标记某个子表达式开始与结束使用小括号"()",最经典的使用莫过于子表达式后面跟限定符,表示对整个子表达式进行限定,而非对限定符前一个字符进行限定
在这里插入图片描述

3.8 定位符

将正则表达式固定到行首或者是行尾,当然定位符也包括很特殊但是十分重要的单词边界定位

符号含义
^匹配输入字符串开始的位置,千万不要与中括号里面的^用法混淆
$匹配输入字符串结束的位置
\b匹配单词边界,即字与空格之间的位置
\B匹配非单词边界

在这里插入图片描述
在这里插入图片描述

四:反向引用

说直白点就是查缓存,使用"()“的子表达式匹配结果会放到缓存区。当需要复用该结果就可以使用\n复用,其中每个缓存会根据顺序按照下标1开始进行存储,\n中的n指定的就是缓存的下标
在这里插入图片描述
如果需要消除掉这个缓存的影响则可以使用”?:"达到目标
在这里插入图片描述

五:前瞻与后顾

说直白一点就是看看前面的子表达式匹配的是不是预期或者看看后面的子表达式是否符合预期,有以下几种表现形式:

  • (?=X):出现位置之后的字符串能匹配X
  • (?<=X):出现位置之前紧跟着的字符串能匹配X
  • (?!X):出现位置之后的字符串不能匹配X
  • (?!<X):出现位置之前的字符串不能匹配X
    在这里插入图片描述
六:贪婪与懒惰

在这里插入图片描述
两种正则的解析模式就是字面含义,贪婪尽可能多点、懒惰则尽可能少点。如上图所示,正则匹配后想看看有多少符合条件的子表达式,就是采用Matcher类的find()与group()方法。其实根据最后的结果来讲,理解这两种正则解析模式就是限定符位置会匹配多少字符串内容。针对这两种解析模式做出如下总结:

  • 懒惰模式会在满足正则匹配后不影响后面子字符串的解析匹配,书写规则为在限定符后加?
  • 贪婪模式会最大程度的根据正则表达式进行解析匹配,限定符默认为贪婪模式
  • 这两种模式下有个共同点都会保证整体文本符合正则表达式解析情况下再发挥特点,这与下面讲解的独占模式有着本质区别
七:独占

在这里插入图片描述
独占是一个比较特殊的存在,不会对匹配解析进行回溯。结合上图你会理解这个回溯是什么意思,即限定符后跟+表示开启独占模式,这时的限定符就会最大程度匹配字符串与贪婪模式一致。但是贪婪模式再贪财也会注意整体大局,也就是示例中匹配到第三个c的时候它发现后面还需要c,如果这个c它匹配了以后整体文本将不会符合正则表达式,这时贪婪模式下会选择放弃匹配回溯,让后面的c进行匹配解析。独占模式可就不管这些,只要符合的都要,最后整个字符串文本是否符合规则与我无关

这篇关于万事万物皆正则 -- Java正则表达的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351140

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2