这是一篇为您准备的关于Java正则表达式的入门教程文章,内容涵盖了基础概念、核心语法以及Java代码实战,适合零基础读者。
2025年Java正则表达式教程:零基础也能看懂
在编程的世界里,处理文本是一项极其常见的任务。无论是校验用户输入的手机号、从一大段日志中提取错误信息,还是简单的查找替换,正则表达式 (Regular Expression) 都是你手中最锋利的瑞士军刀。
虽然已经到了2025年,AI编程助手层出不穷,但掌握正则表达式的原理,依然是每位Java开发者必修的基本功。本文将带你从零开始,彻底搞懂Java中的正则表达式。
1. 什么是正则表达式?
简单来说,正则表达式就是一个字符串模板。我们定义一个规则(比如:“由3个数字组成”),然后用这个规则去匹配目标字符串。
- 规则:
\d{3}(表示连续3个数字) - 目标:
abc123xyz-> 匹配成功 (找到了123)
2. Java正则的核心类
在 Java (java.util.regex 包) 中,有两个核心类是你必须认识的:
Pattern(模式):正则表达式的编译表示。它负责解析你的正则字符串,类似于把图纸变造好的模具。Matcher(匹配器):用Pattern创建的模具,去匹配具体的文本。
2025 快速上手示例 (使用 Java 21+ 风格)
“`java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo {
public static void main(String[] args) {
// 1. 定义规则:匹配所有的数字
String regex = “\d+”;
String content = “订单号:20250101,数量:50”;
// 2. 编译正则
Pattern pattern = Pattern.compile(regex);
// 3. 创建匹配器
Matcher matcher = pattern.matcher(content);
// 4. 查找匹配结果
while (matcher.find()) {
System.out.println("找到数字: " + matcher.group());
}
}
}
*输出结果:*text
找到数字: 20250101
找到数字: 50
“`
注意:在Java字符串中,反斜杠
\需要转义。所以正则表达式里的\d(数字),在Java代码里必须写成\\d。
3. 核心语法速查表
掌握以下符号,你就能读懂90%的正则。
3.1 字符类 (匹配谁?)
| 符号 | 说明 | 示例 |
|---|---|---|
. |
匹配除换行符以外的任意字符 | a.c 匹配 abc, a@c |
[abc] |
字符集合,匹配 a 或 b 或 c | [Cc]at 匹配 Cat, cat |
[^abc] |
否定集合,匹配除了 a, b, c 之外的字符 | [^0-9] 匹配非数字 |
\d |
数字 (Digit),等价于 [0-9] |
\d\d 匹配 25 |
\w |
单词字符 (Word),包含字母/数字/下划线 | user_\w 匹配 user_1 |
\s |
空白字符 (Space),包含空格/制表符等 | Hello\sWorld |
3.2 量词 (匹配多少次?)
| 符号 | 说明 | 示例 |
|---|---|---|
* |
0次 或 多次 | zo* 匹配 z, zoo |
+ |
1次 或 多次 | zo+ 匹配 zo, zoo (不匹配 z) |
? |
0次 或 1次 | do(es)? 匹配 do, does |
{n} |
恰好 n 次 | \d{4} 匹配 2025 |
{n,} |
至少 n 次 | \d{2,} 匹配 10, 100 |
{n,m} |
n 到 m 次 | \d{1,3} 匹配 1, 12, 123 |
3.3 边界匹配 (在哪里匹配?)
^: 行首。^Java匹配以Java开头的行。$: 行尾。end$匹配以end结尾的行。
4. 进阶技巧:分组与贪婪
4.1 分组 ()
用小括号把一部分规则包起来,看作一个整体。
* (\d{4})-(\d{2})-(\d{2})
* 这个正则可以匹配日期 2025-12-19。
* matcher.group(1) 将提取出 2025,group(2) 提取出 12。
4.2 贪婪 vs 非贪婪
默认情况下,正则也是“贪婪”的,会尽可能多地匹配。
* 文本:<div>test</div><div>demo</div>
* 正则:<div>.*</div>
* 贪婪匹配结果:<div>test</div><div>demo</div> (直接匹配到最后一个 </div>)
如果你只想匹配第一个 </div>,需要在量词后加 ? 变为非贪婪模式:
* 正则:<div>.*?</div>
* 非贪婪匹配结果:<div>test</div> (遇到第一个结束符就停止)
5. Java 实战常用案例
校验手机号 (中国大陆)
java
public static boolean isMobile(String phone) {
// 规则:1开头,第二位3-9,后面9位数字
String regex = "^1[3-9]\\d{9}$";
return Pattern.matches(regex, phone);
}
校验电子邮箱
java
public static boolean isEmail(String email) {
// 简单版规则
String regex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
return Pattern.matches(regex, email);
}
字符串替换 (脱敏处理)
java
String phone = "13812345678";
// 替换中间4位为 ****
// group(1)是前3位,group(2)是后4位
String result = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(result); // 输出:138****5678
6. 总结
2025年,虽然工具在变,但数据的本质没有变。掌握正则表达式,能让你在处理字符串时不再使用笨拙的 indexOf 和 substring 拼凑逻辑。
学习建议:
1. 多练:不要死记硬背,使用在线工具(如 regex101)实时测试你的表达式。
2. 由简入繁:先把大规则写出来,再逐步细化边界条件。
3. 注意性能:避免在极长文本中使用复杂的嵌套量词,防止“回溯”导致的性能问题。
希望这篇文章能帮你敲开正则的大门!