Java正则表达式
一、为什么要学习正则表达式#
1、为了解决上述问题。Java提供了正则表达式技术,专门来处理类似于文本问题
2、简单来说:正则表达式是对字符串进行模式匹配的技术
3、正则表达式:regular expression => regexp
二、正则表达式语法#
1、元字符-转义号 \\ #
在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错
例如 用$去匹配 "abc$"
需要用到转义符号的字符有以下: + () $ / \ ? [ ] ^ {}
2、元字符-字符匹配符#
1)[a-z]说明:表示可以匹配a-z中的任意一个字符
//String regStr = "[a-z]"; //匹配a-z之间的任意一个字符 //String regStr = "[A-Z]"; //匹配[A-Z]之间的任意一个字符
2)java正则表达式是默认区分大小写的,如何实现不区分大小写
String regStr = "abc"; //匹配abc字符串【默认区分大小写】 // String regStr = "(?i)abc"; //匹配abc字符串【不区分大小写】 //1、当创建Pattern对象是,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写 Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
3)[^a-z]表示匹配不是a-z的所有字符
4)[abcd] 表示可以匹配abcd中的任意一个字符
5)[^abcd]表示匹配不是abcd中的任意一个字符
6)\\d表示可以匹配0-9中的任意一个数字,相当一[0-9]
7)\\D表示可以匹配不是0-9中的任意一个数字,相当于[^0-9]
8)\\w匹配任意英文字符,数字和下划线,相当于[a-zA-Z0-9_]
9)\\W相当于[^a-zA-Z0-9_]
10)\\s表示匹配任何空白字符串(空格,制表符等)
11)\\S匹配任何非空白字符
12) . 匹配\n之外的所有字符,如果需要匹配,如果需要匹配 . 本身,则需要使用 \\.
public class RegexpTest3 { public static void main(String[] args) { String content = "aabcbzABCF8hGgh"; //String regStr = "[a-z]"; //匹配a-z之间的任意一个字符 //String regStr = "[A-Z]"; //匹配[A-Z]之间的任意一个字符 //String regStr = "abc"; //匹配abc字符串【默认区分大小写】 // String regStr = "(?i)abc"; //匹配abc字符串【不区分大小写】 String regStr = "[^a-z]"; //匹配不是a-z之间的任意一个字符 //1、当创建Pattern对象是,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写 Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while (matcher.find()){ System.out.println("找到:"+matcher.group(0)); } } }
3、选择匹配符#
在匹配某个字符串的时候是选择性的,即:即可以匹配这个,也可以匹配哪个,这是需要用到选择
匹配符号 |
public class RegexpTest4 { public static void main(String[] args) { String content = "aabcbzABCF寒 函 han8hGgh"; String regStr = "函|han|寒"; //匹配不是a-z之间的任意一个字符 Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while (matcher.find()){ System.out.println("找到:"+matcher.group(0)); } } }
4、正则限定符#
用于指定其前面的字符和组合项,连续出现多少次
public class RegexpTest5 { public static void main(String[] args) { String content = "aaaaaafafag342gggg"; //String regStr = "a{3}"; //匹配aaa //String regStr = "\\d{2}"; //匹配两位连续的数字 //匹配aa | aaa | aaaa (java匹配时默认是贪婪匹配,也就是尽可能匹配多的 aaaa) //String regStr = "a{2,4}"; //String regStr = "\\d{2,4}"; //表示匹配2位连续的数字 | 3位连续的数字 | 4位连续的数字 //String regStr = "1+"; //吊事匹配1个1或者多个1 //String regStr = "1?"; //表示匹配 1 | 11 String regStr = "1*"; //匹配1个1 或者 多个1 Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while (matcher.find()){ System.out.println("找到:"+matcher.group(0)); } } }
5、正则定位符#
规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个定位符是非常有用的,
必须掌握
^ 和 $ 使用最多
public class RegexpTest6 { public static void main(String[] args) { String content = "han fadsjfdafhan"; //String regStr = "^[0-9]+[a-z]*"; //匹配以数字开头且后面跟0或者多个字符的字符串 //String regStr = "^[0-9]+[a-z]+$*"; //匹配以数字开头且后面跟一个小写字母结束 //表示匹配边界的han [这里的边界指的是:被匹配的字符串的最后或者空格的字符串的后面 -》han fadsjfdafhan】 String regStr = "han\\b"; //匹配以数字开头且后面跟一个小写字母结束 Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while (matcher.find()){ System.out.println("找到:"+matcher.group(0)); } } }
6、分组#
public class RegexpTest7 { public static void main(String[] args) { String content = "han fadsjfdafhan af444 nn38948949"; //匹配四个数字的字符串 /* 下面就是非命名分组 说明: 1、matcher.group(0) 得到匹配的字符串 2、matcher.group(1) 得到匹配字符串的第一个分组 3、matcher.group(2) 得到匹配字符串的第二个分组 */ // String regStr = "(\\d\\d)(\\d\\d)"; //命令分组,即可以给分组取名 String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)"; Pattern pattern = Pattern.compile(regStr); 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.group("g1")); System.out.println("找到第二个分组的内容:"+matcher.group("g2")); } } }
7、特别分组#
特别分组实例演示
public class RegexpTest8 { public static void main(String[] args) { String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学"; //1、找到韩顺平教育 | 韩顺平老师 | 韩顺平同学 子字符串 //String regStr = "韩顺平教育|韩顺平老师|韩顺平同学"; //上面的写法可以等价与非捕获分组 String regStr = "韩顺平(?:教育|老师|同学)"; //括号中的内容不能通过matcher.group(1)捕获的 Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while (matcher.find()){ System.out.println("找到:"+matcher.group(0)); } } }
public class RegexpTest8 { public static void main(String[] args) { String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学"; //2、找到韩顺平这个关键字,但是要求只是查找韩顺平教育和韩顺平开始中包含的韩顺平 String regStr = "韩顺平(?=教育|老师)"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while (matcher.find()){ System.out.println("找到:"+matcher.group(0)); } } }
8、? 非贪婪匹配#
当字符紧跟随其他任何限定符(* + ? {n} {n,} {n,m})之后时,匹配模式是非贪心的。非贪心的模式匹配搜索到的是尽可能短的字符串;
而默认的贪心的匹配搜索模式匹配搜索到的是尽可能长的字符串。
例如在字符串 "oooo"中,”o+"匹配所有“o" 而”o+?"匹配一个“o"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2020-12-24 注解@RequestMapping中的produces,consumes属性