Java常用类核心详解(七):正则表达式 Regex 从入门到实战

🏠个人主页:黎雁

🎬作者简介:C/C++/JAVA后端开发学习者

❄️个人专栏:C语言数据结构(C语言)EasyXJAVA游戏规划程序人生

✨ 从来绝巘须孤往,万里同尘即玉京

文章目录

  • [Java常用类核心详解(七):正则表达式 Regex 从入门到实战 ✨](#Java常用类核心详解(七):正则表达式 Regex 从入门到实战 ✨)
    • [📚 知识回顾](#📚 知识回顾)
    • [📝 文章摘要](#📝 文章摘要)
  • [1. 正则表达式是什么?🧩](#1. 正则表达式是什么?🧩)
  • [2. 最常用正则语法速查表(背这张就够)📌](#2. 最常用正则语法速查表(背这张就够)📌)
    • [2.1 字符匹配](#2.1 字符匹配)
    • [2.2 数量词](#2.2 数量词)
    • [2.3 边界与分组](#2.3 边界与分组)
  • [3. Java 正则三种使用方式(开发全覆盖)💻](#3. Java 正则三种使用方式(开发全覆盖)💻)
    • [方式1:String 自带 matches(最简单,校验专用)](#方式1:String 自带 matches(最简单,校验专用))
    • [方式2:Pattern + Matcher(最强大,提取专用)🔥](#方式2:Pattern + Matcher(最强大,提取专用)🔥)
    • [方式3:split / replaceAll(批量处理)](#方式3:split / replaceAll(批量处理))
  • [4. 高频实战:开发必用校验(直接复制)✅](#4. 高频实战:开发必用校验(直接复制)✅)
    • [4.1 手机号校验(11位,以1开头)](#4.1 手机号校验(11位,以1开头))
    • [4.2 邮箱校验](#4.2 邮箱校验)
    • [4.3 身份证(18位,含X)](#4.3 身份证(18位,含X))
    • [4.4 密码(6~16位,字母+数字)](#4.4 密码(6~16位,字母+数字))
  • [5. 高级实战:分组提取数据(爬虫/日志必备)🔥](#5. 高级实战:分组提取数据(爬虫/日志必备)🔥)
    • [分组提取(如提取 区号-号码 中的号码)](#分组提取(如提取 区号-号码 中的号码))
  • [6. 贪婪 vs 非贪婪匹配(面试高频)⚡](#6. 贪婪 vs 非贪婪匹配(面试高频)⚡)
  • [7. 完整综合实战 Demo(可直接上线)✅](#7. 完整综合实战 Demo(可直接上线)✅)
  • [📌 重点总结(面试&开发必背)](#📌 重点总结(面试&开发必背))
  • [✍️ 写在最后](#✍️ 写在最后)

Java常用类核心详解(七):正则表达式 Regex 从入门到实战 ✨

本文属于 Java 常用类核心精讲系列 🔥

🔥 字符串校验、数据提取、格式替换必学!手机号/邮箱/身份证/密码校验一网打尽


📚 知识回顾

上一篇我们彻底吃透了 BigDecimal 高精度小数

  • 解决 0.1+0.2≠0.3 精度丢失问题,金融金额必用
  • 推荐创建方式:new BigDecimal("字符串")
  • 加减乘除:addsubtractmultiplydivide(..., 精度, 舍入模式)
  • 比较大小用 compareTo,不要用 equals==
  • 不可变对象,运算后必须接收新对象

本篇进入字符串处理神器正则表达式,开发、爬虫、面试高频必考。


📝 文章摘要

  • 文章主题:Java 正则表达式 Regex 语法 + 实战校验 + 数据提取
  • 阅读时长:10 分钟
  • 适合人群
    • Java 零基础:快速学会字符串格式校验
    • 后端开发:手机号、邮箱、身份证、密码、验证码校验
    • 爬虫/数据处理:批量提取网页、日志中的关键信息
    • 面试:正则语法、分组、贪婪匹配高频考点
  • 阅读重点 (★面试+开发双高频)
    1. Java 正则三大核心类:PatternMatcherString
    2. 最常用正则语法(字符、数量、边界、分组)
    3. ★ 实战:手机号、邮箱、身份证、密码校验
    4. ★ 数据提取:分组捕获、批量查找
    5. 贪婪 / 非贪婪匹配区别与使用场景

1. 正则表达式是什么?🧩

正则表达式(Regex/Regular Expression)

= 一套通用字符串规则,用来做:

  • 校验字符串是否符合格式(手机号、邮箱)
  • 从文本中提取想要的内容(电话、链接、数字)
  • 替换、删除指定格式内容

Java 中通过 java.util.regex 包实现:

  • Pattern:正则表达式编译对象
  • Matcher:匹配器,执行匹配、查找、提取、替换
  • String 类自带 matches()split()replaceAll() 底层也是正则

2. 最常用正则语法速查表(背这张就够)📌

2.1 字符匹配

符号 含义
. 匹配任意字符(除换行)
\d 数字 0-9
\D 非数字
\w 字母、数字、下划线 [a-zA-Z0-9_]
\W 非单词字符
\s 空格、制表符、换行
[abc] 匹配 a、b、c 中任意一个
[^abc] 不匹配 a、b、c
[a-z] 小写字母
[A-Z] 大写字母

2.2 数量词

符号 含义
? 0 次或 1 次
* 0 次或多次
+ 1 次或多次
{n} 正好 n 次
{n,} 至少 n 次
{n,m} n~m 次

2.3 边界与分组

| 符号 | 含义 |

| --- | --- | --- |

| ^ | 行开头 |

| $ | 行结尾 |

| () | 分组,可提取内容 |

| | | 或 |

| \\ | 转义(Java 中要写两个反斜杠:\\d) |

重点:Java 字符串里写正则,反斜杠必须写 2 个\\d 表示数字


3. Java 正则三种使用方式(开发全覆盖)💻

方式1:String 自带 matches(最简单,校验专用)

java 复制代码
boolean isValid = str.matches("正则表达式");

适合:手机号、邮箱、密码等整体校验

方式2:Pattern + Matcher(最强大,提取专用)🔥

java 复制代码
// 1. 编译正则
Pattern pattern = Pattern.compile("正则");
// 2. 获取匹配器
Matcher matcher = pattern.matcher(字符串);
// 3. 查找 / 匹配 / 提取
matcher.find();
matcher.group();

适合:提取、查找、循环匹配、多分组

方式3:split / replaceAll(批量处理)

java 复制代码
String[] arr = str.split("\\D");    // 按非数字切割
String newStr = str.replaceAll("\\d", "*"); // 数字变*

4. 高频实战:开发必用校验(直接复制)✅

4.1 手机号校验(11位,以1开头)

java 复制代码
public static boolean isPhone(String phone) {
    String regex = "^1[3-9]\\d{9}$";
    return phone != null && phone.matches(regex);
}

规则:

  • ^1:以 1 开头
  • [3-9]:第二位 3~9
  • \\d{9}:后面 9 位数字
  • $:结尾

4.2 邮箱校验

java 复制代码
public static boolean isEmail(String email) {
    String regex = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$";
    return email != null && email.matches(regex);
}

4.3 身份证(18位,含X)

java 复制代码
public static boolean isIdCard(String id) {
    String regex = "^[1-9]\\d{16}(\\d|X|x)$";
    return id != null && id.matches(regex);
}

4.4 密码(6~16位,字母+数字)

java 复制代码
public static boolean isPassword(String pwd) {
    String regex = "^[a-zA-Z0-9]{6,16}$";
    return pwd != null && pwd.matches(regex);
}

5. 高级实战:分组提取数据(爬虫/日志必备)🔥

示例:从文本中提取所有手机号

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExtractDemo {
    public static void main(String[] args) {
        String content = "联系电话:13800138000,另一个:13912345678,备用:13100001111";

        // 正则
        String regex = "1[3-9]\\d{9}";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(content);

        // 循环提取所有手机号
        while (matcher.find()) {
            String phone = matcher.group();
            System.out.println("提取到手机号:" + phone);
        }
    }
}

分组提取(如提取 区号-号码 中的号码)

java 复制代码
String str = "010-12345678";
String regex = "(\\d{3,4})-(\\d{7,8})";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);

if (m.find()) {
    String areaCode = m.group(1); // 010
    String phoneNum = m.group(2); // 12345678
}

6. 贪婪 vs 非贪婪匹配(面试高频)⚡

模式 写法 行为
贪婪(默认) .* 尽可能匹配
非贪婪 .*? 尽可能匹配

示例:

html 复制代码
<div>abc</div><div>def</div>
  • 贪婪 <div>.*</div> → 匹配一整段
  • 非贪婪 <div>.*?</div> → 匹配两个单独标签

开发中提取标签、括号内容优先用非贪婪


7. 完整综合实战 Demo(可直接上线)✅

java 复制代码
public class RegexAllDemo {
    public static void main(String[] args) {
        String phone = "13812345678";
        String email = "test123@qq.com";
        String idCard = "11010119900101123X";
        String pwd = "abc123456";

        System.out.println("手机号:" + isPhone(phone));
        System.out.println("邮箱:" + isEmail(email));
        System.out.println("身份证:" + isIdCard(idCard));
        System.out.println("密码:" + isPassword(pwd));
    }

    // 手机号校验
    public static boolean isPhone(String phone) {
        return phone.matches("^1[3-9]\\d{9}$");
    }

    // 邮箱校验
    public static boolean isEmail(String email) {
        return email.matches("^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$");
    }

    // 身份证
    public static boolean isIdCard(String id) {
        return id.matches("^[1-9]\\d{16}(\\d|X|x)$");
    }

    // 密码
    public static boolean isPassword(String pwd) {
        return pwd.matches("^[a-zA-Z0-9]{6,16}$");
    }
}

📌 重点总结(面试&开发必背)

  1. 正则 = 字符串规则,用于校验、提取、替换
  2. Java 中转义:\ 必须写成 \\
  3. 三大使用方式:
    • String.matches(正则) → 校验
    • Pattern + Matcher → 提取/查找
    • split / replaceAll → 批量处理
  4. 开发高频校验:
    • 手机号:^1[3-9]\\d{9}$
    • 邮箱:通用正则直接复制
    • 身份证:^[1-9]\\d{16}(\\d|X|x)$
  5. 提取内容用 **分组()**,循环用 while(matcher.find())`
  6. 面试必问:贪婪 vs 非贪婪.* vs .*?

✍️ 写在最后

正则是 Java 开发最实用的字符串工具,无论做后端、爬虫、数据清洗、表单校验,几乎都离不开。本篇从语法到实战全覆盖,代码可直接复制进项目使用。

相关推荐
秀儿还能再秀1 小时前
正则表达式核心语法 + Python的 re 库中常用方法
python·正则表达式
xcLeigh1 小时前
Python入门:Python3 正则表达式全面学习教程
python·学习·正则表达式·教程·python3
PingdiGuo_guo1 小时前
C++数据类型、变量常量
开发语言·c++
sheji34162 小时前
【开题答辩全过程】以 婚纱影楼管理系统为例,包含答辩的问题和答案
java·eclipse
LuDvei2 小时前
LINUX文件操作函数
java·linux·算法
多恩Stone2 小时前
【C++ debug】在 VS Code 中无 Attach 调试 Python 调用的 C++ 扩展
开发语言·c++·python
PingdiGuo_guo2 小时前
C++联合体详解!
开发语言·c++
葵续浅笑3 小时前
从Spring拦截器到Filter过滤器:一次报文修改加解密的填坑经验
java·后端·spring