Java中使用正则表达式的详细教程

 更新时间:2025年09月02日 08:59:07   作者:三水  
本文介绍Java正则表达式基础语法及使用方法,涵盖Pattern/Matcher类、字符匹配、量词、分组、预定义类、转义规则及性能优化建议,提供邮箱、手机号、身份证、URL等常见验证示例,感兴趣的朋友跟随小编一起看看吧

正则表达式基础语法

Java正则表达式基于java.util.regex包,核心类是Pattern和Matcher。基本语法遵循标准正则规范:

  • . 匹配任意单个字符(除换行符)
  • \d 匹配数字,等价于 [0-9]
  • \w 匹配单词字符,等价于 [a-zA-Z0-9_]
  • \s 匹配空白字符(空格、制表符等)
  • [] 字符集合,如 [abc] 匹配a、b或c
  • ^ 在字符集中表示否定,如 [^abc] 匹配非a/b/c的字符
  • * 匹配前一个元素0次或多次
  • + 匹配前一个元素1次或多次
  • ? 匹配前一个元素0次或1次
  • {n} 精确匹配n次
  • {n,} 匹配至少n次
  • {n,m} 匹配n到m次
  • | 写在方括号外面,表示或
  • && 交集,表示与
  • (?!) 忽略后面字符的大小写

常用预定义字符类

\\d    数字 [0-9]
\\D    非数字 [^0-9]
\\s    空白字符 [ \\t\\n\\x0B\\f\\r]
\\S    非空白字符 [^\\s]
\\w    单词字符 [a-zA-Z_0-9]
\\W    非单词字符 [^\\w]

边界匹配符

^ 匹配行首
$ 匹配行尾
\b 匹配单词边界
\B 匹配非单词边界

Java中的特殊处理

在Java字符串中需要使用双反斜杠转义:

// 匹配数字的正则表达式
String regex = "\\d+"; // 实际表示 \d+

Pattern和Matcher使用示例

import java.util.regex.*;
String text = "Hello 123 World";
// Pattern:表示正则表达式
Pattern pattern = Pattern.compile("\\d+");
// Matcher:文本匹配器,从头开始读取,直到读取到匹配的字符串
Matcher matcher = pattern.matcher(text);
// 查找匹配
while (matcher.find()) {
    System.out.println("Found: " + matcher.group());
}
// 匹配整个字符串
boolean isMatch = Pattern.matches("Hello.*", text);
  • 贪婪爬取:用+,*,表示尽可能多的获取数据
  • 非贪婪爬取:在+,*后面加上?,表示尽可能少的获取数据
        String str = "aaaaaaaaaabbbbbbbbaaaaaaaaa";
        System.out.println("--------- 贪婪匹配 ---------");
        // 贪婪匹配
        Pattern p = Pattern.compile("ab+");
        Matcher m = p.matcher(str);
        while (m.find()) {
            System.out.println(m.group());
        }
        System.out.println("--------- 懒惰匹配 ---------");
        // 懒惰匹配
        Pattern p1 = Pattern.compile("ab+?");
        Matcher m1 = p1.matcher(str);
        while (m1.find()) {
            System.out.println(m1.group());
        }

效果图:

分组和捕获

使用()创建捕获组:

String str = "a123a";
        String str1 = "abc123abc";
        String str2 = "1117891111";
        String str3 = "aa7879a";
        // 捕获分组
        System.out.println("--------- 捕获分组 ---------");
        String regex = "(.).+\\1";
        String regex1 = "(.+).+\\1";
        String regex2 = "((.)\\2).+\\1";
        System.out.println(str.matches(regex));
        System.out.println(str1.matches(regex1));
        System.out.println(str2.matches(regex2));
        System.out.println(str3.matches(regex2));
        // 非捕获分组
        System.out.println("--------- 非捕获分组 ---------");
        String str4 = "我要学学变变变变撑撑撑撑撑";
        str4 = str4.replaceAll("(.)\\1+", "$1");// replaceAll() 方法用于把所有满足匹配的字符串替换成指定的字符串
        System.out.println(str4);

效果图:

  • 从1开始,连续不断
  • 以左括号为基准
  • 捕获分组(默认):① 内部:\组号 ② 外部:$组号(组号会保留下来)
  • 非捕获分组:使用条件,不占组号
    • "?=":表示任一数据
    • "?:":表示所有数据
    • "?!":表示不包含这些数据

常用正则表达式示例

  • 邮箱验证:
    String emailRegex = "^[\\w-_.+]*[\\w-_.]@([\\w]+\\.)+[\\w]+[\\w]$";
  • 手机号验证(中国大陆):
    String phoneRegex = "^1[3-9]\\d{9}$";
  • 身份证号验证(简易版):
    String idCardRegex = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$";
  • URL验证:
    String urlRegex = "^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$";

特殊匹配模式

通过Pattern的常量设置匹配模式:

// 不区分大小写匹配
Pattern.CASE_INSENSITIVE 
// 多行模式(^和$匹配每行的开头和结尾)
Pattern.MULTILINE
// 示例:不区分大小写匹配
Pattern.compile("hello", Pattern.CASE_INSENSITIVE).matcher("Hello").find(); // true

字符串替换

使用正则表达式进行字符串替换:

String text = "a1b2c3";
String replaced = text.replaceAll("\\d", "-"); // a-b-c-

性能优化建议

预编译常用正则表达式:

private static final Pattern EMAIL_PATTERN = Pattern.compile(emailRegex);
  1. 避免过度使用.通配符,尽可能明确匹配范围
  2. 对于简单固定字符串匹配,优先使用String.contains()或String.startsWith()等原生方法
  3. 谨慎使用回溯量大的表达式(如嵌套的量词)

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

相关文章

  • Java中使用注解的实例详解

    Java中使用注解的实例详解

    注解(Annotation)是放在Java源码的类、方法、字段、参数前的一种特殊“注释”,这篇文章主要介绍了Java中如何使用注解,需要的朋友可以参考下
    2023-06-06
  • Java微信公众平台开发(10) 微信自定义菜单的创建实现

    Java微信公众平台开发(10) 微信自定义菜单的创建实现

    这篇文章主要为大家详细介绍了Java微信公众平台开发第十步,微信自定义菜单的创建实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringBoot中加密模块的使用

    SpringBoot中加密模块的使用

    本文主要介绍了SpringBoot中加密模块的使用,包括对称加密、非对称加密和哈希加密等,同时还会提供相应的代码示例,感兴趣的朋友可以参考一下
    2023-05-05
  • Java实现微信支付的项目实践

    Java实现微信支付的项目实践

    最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,本文就来介绍一下Java实现微信支付的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • SpringBoot 2.x 接入非标准SSE格式大模型流式响应的实战解决方案

    SpringBoot 2.x 接入非标准SSE格式大模型流式响应的实战解决方案

    本文介绍了在SpringBoot2.7.3环境中接入非标准SSE格式大模型流式响应的实战解决方案,通过自定义实现,解决了大模型返回数据格式不符合标准SSE规范的问题,关键步骤包括引入Gradle依赖、配置WebClient、处理粘包、格式兼容和双重过滤机制,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    Java线程操作的常见方法【线程名称获取、设置、线程启动判断等】

    这篇文章主要介绍了Java线程操作的常见方法,结合实例形式总结分析了java线程的创建、线程名称的获取、设置以及线程启动的判断等相关操作实现技巧,需要的朋友可以参考下
    2019-10-10
  • Spring中的Aware接口及应用场景详解

    Spring中的Aware接口及应用场景详解

    这篇文章主要介绍了Spring中的Aware接口及应用场景,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 基于Java实现的一层简单人工神经网络算法示例

    基于Java实现的一层简单人工神经网络算法示例

    这篇文章主要介绍了基于Java实现的一层简单人工神经网络算法,结合实例形式分析了java实现人工神经网络的具体实现技巧,需要的朋友可以参考下
    2017-12-12
  • 详解Java运算中的取余

    详解Java运算中的取余

    这篇文章主要介绍了java运算中的取余,在java运算中,取余符号是 %,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 一文详解MVCC的执行原理

    一文详解MVCC的执行原理

    MVCC是一种并发控制机制,用于解决数据库并发访问中,数据一致性问题,它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离性,本文将和大家简单聊聊MVCC的执行原理,需要的朋友可以参考下
    2023-12-12

最新评论