
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生
✨ 从来绝巘须孤往,万里同尘即玉京

文章目录
- [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("字符串") - 加减乘除:
add、subtract、multiply、divide(..., 精度, 舍入模式) - 比较大小用
compareTo,不要用equals或== - 不可变对象,运算后必须接收新对象
本篇进入字符串处理神器 :正则表达式,开发、爬虫、面试高频必考。
📝 文章摘要
- 文章主题:Java 正则表达式 Regex 语法 + 实战校验 + 数据提取
- 阅读时长:10 分钟
- 适合人群 :
- Java 零基础:快速学会字符串格式校验
- 后端开发:手机号、邮箱、身份证、密码、验证码校验
- 爬虫/数据处理:批量提取网页、日志中的关键信息
- 面试:正则语法、分组、贪婪匹配高频考点
- 阅读重点 (★面试+开发双高频)
- Java 正则三大核心类:
Pattern、Matcher、String - 最常用正则语法(字符、数量、边界、分组)
- ★ 实战:手机号、邮箱、身份证、密码校验
- ★ 数据提取:分组捕获、批量查找
- 贪婪 / 非贪婪匹配区别与使用场景
- Java 正则三大核心类:
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}$");
}
}
📌 重点总结(面试&开发必背)
- 正则 = 字符串规则,用于校验、提取、替换
- Java 中转义:
\必须写成\\ - 三大使用方式:
String.matches(正则)→ 校验Pattern + Matcher→ 提取/查找split / replaceAll→ 批量处理
- 开发高频校验:
- 手机号:
^1[3-9]\\d{9}$ - 邮箱:通用正则直接复制
- 身份证:
^[1-9]\\d{16}(\\d|X|x)$
- 手机号:
- 提取内容用 **分组()
**,循环用while(matcher.find())` - 面试必问:贪婪 vs 非贪婪 (
.*vs.*?)
✍️ 写在最后
正则是 Java 开发最实用的字符串工具,无论做后端、爬虫、数据清洗、表单校验,几乎都离不开。本篇从语法到实战全覆盖,代码可直接复制进项目使用。