Java正则表达式超详细讲解(简单易懂版)

 更新时间:2025年06月25日 08:54:58   作者:吗喽对你问好  
前段时间使用Java的正则表达式做一些字符串匹配的任务,现将学到的正则表达式的知识整理成文,这篇文章主要介绍了Java正则表达式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

正则表达式是用来匹配和处理文本的强大工具。在Java中,主要通过 java.util.regex 包中的 Pattern 和 Matcher 类来实现。

一、基础概念

1. 什么是正则表达式?

正则表达式(Regular Expression)是一种用来描述字符串模式的特殊语法,可以用来:

  • 检查字符串是否符合某种格式

  • 从字符串中提取特定部分

  • 替换字符串中的内容

2. Java中正则表达式的两个核心类:

  • Pattern:编译后的正则表达式模式

  • Matcher:用模式匹配字符串的引擎

二、基本语法

1. 普通字符

普通字符(字母、数字)直接匹配自身:

  • a 匹配字母"a"

  • 5 匹配数字"5"

2. 特殊字符(元字符)

这些字符有特殊含义,需要用\转义:

. ^ $ * + ? { } [ ] \ | ( )

3. 常用元字符

字符说明示例
.匹配任意单个字符a.c 匹配 "abc"、"a1c"
\d数字 [0-9]\d\d 匹配 "12"、"34"
\D非数字 [^0-9]\D\D 匹配 "ab"、"##"
\w单词字符 [a-zA-Z0-9_]\w\w 匹配 "a1"、"B_"
\W非单词字符\W\W 匹配 "@#"、"! "
\s空白字符 [ \t\n\x0B\f\r]a\sb 匹配 "a b"
\S非空白字符a\Sb 匹配 "a1b"

4. 量词

量词说明示例
*0次或多次a* 匹配 ""、"a"、"aa"
+1次或多次a+ 匹配 "a"、"aa"
?0次或1次a? 匹配 ""、"a"
{n}恰好n次a{2} 匹配 "aa"
{n,}至少n次a{2,} 匹配 "aa"、"aaa"
{n,m}n到m次a{2,4} 匹配 "aa"、"aaa"、"aaaa"
正则表达式描述

this is text

匹配字符串 "this is text"

this\s+is\s+text

注意字符串中的 \s+

匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。

可以匹配这个实例:this is text

^\d+(\.\d+)?

^ 定义了以什么开始

\d+ 匹配一个或多个数字

? 设置括号内的选项是可选的

\. 匹配 "."

可以匹配的实例:"5", "1.5" 和 "2.21"。

三、Java中使用正则表达式

1. 简单匹配示例

String text = "Hello, my phone number is 123-456-7890";
String pattern = "\\d{3}-\\d{3}-\\d{4}"; // 匹配电话号码格式

boolean isMatch = text.matches(pattern); // false,因为matches要求整个字符串匹配
boolean contains = Pattern.compile(pattern).matcher(text).find(); // true

2. 完整使用步骤

// 1. 编译正则表达式
Pattern p = Pattern.compile("a*b");

// 2. 创建匹配器
Matcher m = p.matcher("aaaaab");

// 3. 进行匹配
boolean b = m.matches(); // true

3. 常用方法

方法说明
matches()整个字符串是否匹配
find()查找下一个匹配项
group()返回匹配的字符串
start()/end()匹配的起始/结束位置
replaceAll()替换所有匹配项

四、实际应用示例

1. 验证邮箱格式

String email = "test@example.com";
String regex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";

boolean isValid = email.matches(regex); // true

2. 提取所有数字

String text = "订单123,金额456.78元";
Pattern p = Pattern.compile("\\d+\\.?\\d*");
Matcher m = p.matcher(text);

while(m.find()) {
    System.out.println("找到数字: " + m.group());
}
// 输出:
// 找到数字: 123
// 找到数字: 456.78

3. 替换字符串

String text = "2023-05-15";
String newText = text.replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$2/$3/$1");
// 结果: "05/15/2023"

五、分组和捕获

()创建分组:

String text = "John Doe, age 30";
Pattern p = Pattern.compile("(\\w+) (\\w+), age (\\d+)");
Matcher m = p.matcher(text);

if(m.find()) {
    System.out.println("姓名: " + m.group(1) + " " + m.group(2));
    System.out.println("年龄: " + m.group(3));
}
// 输出:
// 姓名: John Doe
// 年龄: 30

六、常见问题

  1. 转义问题:Java字符串中\需要写成\\

    • 正则中的\d → Java字符串中写成"\\d"

  2. 贪婪匹配:默认是贪婪匹配(匹配尽可能多的字符)

    • 在量词后加?改为非贪婪匹配:.*?

  3. 性能优化

    • 重用Pattern对象(编译正则表达式比较耗时)

    • 避免过度复杂的正则表达式

总结 

到此这篇关于Java正则表达式的文章就介绍到这了,更多相关Java正则表达式详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot+mybatis报错找不到实体类的问题

    springboot+mybatis报错找不到实体类的问题

    这篇文章主要介绍了springboot+mybatis报错找不到实体类的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 在拦截器中读取request参数,解决在controller中无法二次读取的问题

    在拦截器中读取request参数,解决在controller中无法二次读取的问题

    这篇文章主要介绍了在拦截器中读取request参数,解决在controller中无法二次读取的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • nohup运行Java tail查看日志方式

    nohup运行Java tail查看日志方式

    nohup命令允许程序在用户退出账户或关闭终端后继续运行,常与"&"结合使用以实现程序的后台执行,配合重定向操作,nohup可以将程序输出保存到日志文件中,如nohup java -jar XXX.jar &> myout.log &,此外,tail命令可用于实时监控日志文件的变化
    2024-09-09
  • 基于Java实现双向链表

    基于Java实现双向链表

    这篇文章主要为大家详细介绍了基于Java实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • java异步编程详解

    java异步编程详解

    这篇文章主要介绍了java异步编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Netty内存池泄漏问题以解决方案

    Netty内存池泄漏问题以解决方案

    这篇文章主要介绍了Netty内存池泄漏问题以解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 详解如何用Java去除HTML标签

    详解如何用Java去除HTML标签

    在平时工作中,偶尔会用 Java 做一些解析HTML的工作。有时需要删除所有的HTML标签,只保留纯文字内容。这个问题在做过一些爬虫工作的朋友来说很简单。下面来说说,我们平时使用到的集中解析的方法
    2022-12-12
  • SpringMVC接收复杂集合对象(参数)代码示例

    SpringMVC接收复杂集合对象(参数)代码示例

    这篇文章主要介绍了SpringMVC接收复杂集合对象(参数)代码示例,举接收List<String>、List<User>、List<Map<String,Object>>、User[]、User(bean里面包含List)几种较为复杂的集合参数,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • spring boot多数据源动态切换代码实例

    spring boot多数据源动态切换代码实例

    这篇文章主要介绍了spring boot多数据源动态切换代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SpringBoot配置开发环境的详细步骤(JDK、Maven、IDEA等)

    SpringBoot配置开发环境的详细步骤(JDK、Maven、IDEA等)

    文章介绍了如何配置SpringBoot开发环境,包括安装JDK、Maven和IDEA,并提供了详细的步骤和配置方法,感兴趣的朋友一起看看吧
    2024-12-12

最新评论