java正则表达式稍微高级一点的用法

2023-11-20 16:50

本文主要是介绍java正则表达式稍微高级一点的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、基础语法回顾

符号含义示例示例描述其他示例
\\b匹配目标字符串的边界,边界指的是串的最后或者空格之前wang\\b匹配边界的wang
\\B匹配目标字符串的非边界wang\\B匹配非边界的wang
\\d和\\D,\\w和\\W\\d和\\D表示[0-9][^0-9]\\w和\\W表示[0-9a-zA-Z][^0-9a-zA-Z]
``匹配|前或者后面的表达式ab|cd匹配ab或者cd
?只是作用于离它最近的字符生效。
(?!)a(?i)bc匹配abc字符,abc不区分大小写,只有b不区分大小写
``
``
``
``

基本语法测试:

public static void main(String[] args) {String content = "a1_2\n1c_8挖";
//        String regStr = "[a-z]";//匹配a-z之间任意一个字符
//        String regStr = "[^a-z]";//匹配不在a-z之间任意一个字符
//        String regStr = "//D";//匹配不是数字的任意一个字符
//        String regStr = "\\w";//匹配数字、字母(大小写)、下划线的任意一个字符;等价于[a-zA-z0-9_]
//         String regStr = "[a-zA-z0-9.]";
//        String regStr = ".";//匹配除\n之外的所有任意一个字符//        String regStr = "\\s";//匹配空白字符(包括空格、制表、回车)
//        String regStr = "[abcd]";//匹配在abcd中的任意一个字符
//        String regStr = "";//匹配abc字符,abc不区分大小写,只有b不区分大小写:"a((?i)b)c"//String regStr = "\\d|挖"; //选择匹配符//String regStr = "_(?!.*_)"; //选择匹配符String regStr = "(_)(\\d)"; //选择匹配符 //创建pattern是制定大小写不敏感Pattern pattern = Pattern.compile(regStr/*,Pattern.CASE_INSENSITIVE*/);Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println("找到字符串【"+matcher.group(0)+"】符合条件");//输出匹配到的整个字符串System.out.println("找到字符串【"+matcher.group(1)+"】符合条件");//输出匹配到的第一个分组System.out.println("找到字符串【"+matcher.group(2)+"】符合条件");//输出匹配到的第二个分组System.out.println("起始位置:"+matcher.start());System.out.println("结束位置:"+matcher.end());}}//输出
找到字符串【_2】符合条件
找到字符串【_】符合条件
找到字符串【2】符合条件
起始位置:2
结束位置:4
找到字符串【_8】符合条件
找到字符串【_】符合条件
找到字符串【8】符合条件
起始位置:7
结束位置:9

2、分组

分组分为捕获分组和非捕获分组,不捕获的话会更经济些,所以如果不需要捕获就不用捕获

image-20221004175246633

image-20221004175305365

(1)捕获分组示例

    public static void main(String[] args) {String content = "industry1551jkh4546askindustriesldsk4444";String regStr = "(?<thisaname>\\d\\d)\\d\\d";//创建pattern是制定大小写不敏感Pattern pattern = Pattern.compile(regStr/*,Pattern.CASE_INSENSITIVE*/);Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println("找到:"+matcher.group(0));System.out.println("找到[通过索引]:"+matcher.group(1));System.out.println("找到[通过组名]:"+matcher.group("thisaname"));}}
//输出
找到:1551
找到[通过索引]15
找到[通过组名]15
找到:4546
找到[通过索引]45
找到[通过组名]45
找到:4444
找到[通过索引]44
找到[通过组名]44

(2)非捕获分组

    public static void main(String[] args) {String content = "industry1551jkh4546askindustriesldsk4444wwq你好,wwqhello,wwqisagunis";//(1)String regStr = "industr(y|ies)";//分组会被捕获//(2)//String regStr = "industr(?:y|ies)";//分组不被捕获,效果和「industr(y|ies)」一样只是不捕获//(3)//String regStr = "wwq(?=hello|is)";//分组不被捕获。只匹配包含分组条件的前面的匹配字符,此处为匹配后面为hello或者is的wwq//(4)//String regStr = "wwq(?!hello|is)";//分组不被捕获。只匹配包含分组条件的前面的匹配字符,此处为匹配后面不为hello或者is的wwq//创建pattern是制定大小写不敏感Pattern pattern = Pattern.compile(regStr/*,Pattern.CASE_INSENSITIVE*/);Matcher matcher = pattern.matcher(content);while (matcher.find()){System.out.println("找到:"+matcher.group(0));}}
//输出1)对应输出:matcher.group(1)输出y或ies找到:industry找到:industries
(2)对应输出:matcher.group(1)异常找到:industry找到:industries
(3)对应输出:matcher.group(1)异常找到:wwq找到:wwq
(4)对应输出:matcher.group(1)异常找到:wwq

3、贪婪匹配

String str="abcaxc";
Patter p="ab.*c";默认是贪婪匹配,匹配到的字符是abcaxc若p改为ab.*c?
则改为非贪婪匹配,匹配到的字符是abc

4、反向引用

括号中的内容被捕获后,在括号的后面可以使用,称为反向引用。这种引用既可以在表达式的内部,也可以在表达式的外部,内部的反向引用使用\\分组号,外部的反向引用使用$分组号

	public static void main(String[] args) {				String content = "我..........我要要....要....学学学....编程!";String regStr = "\\.";//创建pattern是制定大小写不敏感Pattern pattern = Pattern.compile(regStr/*,Pattern.CASE_INSENSITIVE*/);//将...去掉//Matcher matcher = pattern.matcher(content);//content = matcher.replaceAll("");content = content.replaceAll(regStr, "");System.out.println(content);/*1. "(.)\\1+",首先匹配出重复的字:(我)我,(要)要要,(学)学学2. 将其替换为分组中的字,即 我我-->我,要要要-->要,学学学-->学*/String res = Pattern.compile("(.)\\1+"/*内部反向引用*/).matcher(content).replaceAll("$1"/*外部反向引用*/);System.out.println(res);}//输出
我我要要要学学学编程!
我要学编程!

5、0宽断言

零宽断言是用来判断是否符合继续匹配的条件,本身并不会匹配字符串

符号说明示例示例描述
?=exp匹配到exp就停止
?!exp匹配不到exp才停止
?<=exp匹配到exp则继续
?<!exp匹配不到exp则继续

(1)?=exp

例如,要匹配 cooking ,singing ,doing中除了ing之外的内容,只取cook, sing, do的内容,这时候的增则表达式可以用 [a-z]*(?=ing) 来匹配

注意:先行断言的执行步骤是这样的先从要匹配的字符串中的最右端找到第一个 ing (也就是先行断言中的表达式)然后 再匹配其前面的表达式,若无法匹配则继续查找第二个 ing 再匹配第二个 ing 前面的字符串,若能匹配则匹配,符合正则的贪婪性。

public static void main(String[] args) {String str = "755iwat888iwat";String regexp = "\\d*(?=iwat)";//匹配到exp就停止Matcher matcher = Pattern.compile(regexp).matcher(str);while (matcher.find()){System.out.println(matcher.group(0));}}
//输出
755
//解析,遇到第一个iwat就不再继续往下匹配了

(2)?<=exp

例如 (?<=abc).* 可以匹配 abcdefg 中的 defg

注意:后发断言跟先行断言恰恰相反 它的执行步骤是这样的:先从要匹配的字符串中的最左端找到第一个abc(也就是先行断言中的表达式)然后 再匹配其后面的表达式,若无法匹配则继续查找第二个 abc 再匹配第二个 abc 后面的字符串,若能匹配则匹配。

public static void main(String[] args) {String str = "755iwat888iwat999";String regexp = "(?<=iwat)\\d*".trim();//只匹配iwat后面的连续数字Matcher matcher = Pattern.compile(regexp).matcher(str);while (matcher.find()){System.out.println(matcher.group(0).trim());}}
//输出
888
999

(3)?!exp(和?=exp相反)

例如 (?!exp) 表示 “exp” 前面的位置,如果 “exp” 不成立 ,匹配这个位置;如果 “exp” 成立,则不匹配。

例1:

		public static void main(String[] args) {String str = "755iwat888iwat888999";String regexp = "888(?!.*888)".trim();//最后一次出现的888Matcher matcher = Pattern.compile(regexp).matcher(str);while (matcher.find()){System.out.println(matcher.group(0));System.out.println(matcher.start());}}
//输出
888
14

例2:

public static void main(String[] args) {String str = "755iwat888iwat888999";String regexp = "[0-9]*(?!iwat)".trim();//匹配后面不是iwat的连续数字Matcher matcher = Pattern.compile(regexp).matcher(str);while (matcher.find()){System.out.println(matcher.group(0));//System.out.println(matcher.start());}}
//输出
75
88
888999

(4)?<!exp

?<=exp相反,放在前面使用

public static void main(String[] args) {String str = "755iwat888iwat888999";String regexp = "(?<!iwat)[0-9]*".trim();//匹配前面不是iwat的连续数字,应是755,88,88999Matcher matcher = Pattern.compile(regexp).matcher(str);while (matcher.find()){System.out.println(matcher.group(0));//System.out.println(matcher.start());}}
//输出
755
88
88999

6、常用API

//  Pattern类的方法
0. Pattern.compile(regStr/*,Pattern.CASE_INSENSITIVE*/)//返回一个Pattern
1. Pattern.matches(regStr,str)//判断模式能否将字符串整体匹配出来,返回一个booleanSystem.out.println(Pattern.matches(regStr,content));
2. Pattern.matcher(content)//返回一个Matcher//  Matcher类的方法
3. Matcher.group(0)//返回匹配到的第0个分组
4. matcher.start()//返回匹配到字符串的开始位置
5. matcher.end()
6. matcher.find()//是否有匹配到的字符串的部分序列
7. matcher.matches()//字符串是否从头到尾完全匹配了(matches方法会吞掉一个matcher匹配的分组)
8. matcher.replaceAll(str)//将匹配到的字符串全部替换为str,返回替换后的字符串//String
9. str.replaceAll(regex,replacement)//使用replacement替换str中匹配的regex部分,返回替换后的字符串
10. str.matches(regex)//等价于Pattern.matches(regex, str),返回boolean
11. str.split(regex)//按照匹配的regex部分对str进行分割,返回一个字符数组,返回的数组中不包括匹配到的部分

这篇关于java正则表达式稍微高级一点的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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