正则表达式(简称正则 / Regex )就是一套字符匹配的规则模板,用简单的符号组合,就能快速实现「判断字符串是否符合规则」「提取字符串中符合规则的内容」「替换字符串中指定内容」等操作,比如验证手机号、邮箱格式,提取文本中的所有数字,替换敏感词等。
Java 中专门提供了java.util.regex包来支持正则,核心只需要掌握正则基础语法 +Java 中 2 个核心类的使用
一、正则的核心思想
你可以把正则想象成 "字符串的筛选器":
- 你用「正则符号」写好筛选规则(比如 "必须是 11 位数字");
- 把这个规则套在目标字符串上(比如 "13800138000");
- 程序根据规则判断匹配 / 不匹配 ,或执行提取 / 替换。
比如验证手机号的正则^1[3-9]\\d{9}$,就是告诉程序:字符串必须以 1 开头,第二位是 3-9 的数字,后面跟 9 个数字,且整个字符串只有这些内容。
二、正则的 "匹配符号"
正则的核心就是各种匹配符号 ,分为「普通字符」和「元字符」,元字符是正则的精髓,也是小白最需要记的,下面按使用频率排序,记熟这些就能解决 80% 的问题。
1. 普通字符
就是平时的字母、数字、汉字、符号(如a-z、0-9、中、@),正则中写什么,就匹配字符串中的什么。
- 例子:正则
abc,只能匹配字符串abc,不匹配ab、abcd、aBc(正则默认区分大小写)。
2. 核心元字符
这些符号有特殊含义,能匹配某一类符合条件的字符 ,不用逐个写,是正则简化书写的关键,Java 中反斜杠 \ 需要转义成 \
| 元字符 | 大白话含义 | 例子 |
|---|---|---|
| . | 匹配任意 1 个字符(除了换行 \n) | 正则a.b可匹配a1b、a@b、aab |
| \\d | 匹配任意 1 个数字(0-9) | 正则\\d\\d可匹配12、99 |
| \\D | 匹配任意 1 个非数字 | 正则\\D可匹配a、@、中 |
| \\w | 匹配任意 1 个单词字符(字母 / 数字 / 下划线),汉字也能匹配 | 正则\\w可匹配A、5、_、张 |
| \\W | 匹配任意 1 个非单词字符 | 正则\\W可匹配@、+、空格 |
| \\s | 匹配任意 1 个空白字符(空格、制表符 \t、换行 \n) | 正则a\\sb可匹配a b、a\tb |
| \\S | 匹配任意 1 个非空白字符 | 正则\\S可匹配1、a、@ |
✅ 重点提醒:Java 中所有带\的正则符号,都要写成\\(因为 Java 字符串中\本身需要转义),比如数字是\\d不是\d!
3. 数量元字符
上面的元字符只能匹配1 个 字符,数量元字符可以指定匹配多次,写在「要限定次数的字符 / 元字符」后面,是实现 "多字符匹配" 的核心
| 数量元字符 | 大白话含义 | 例子 |
|---|---|---|
| * | 匹配0 次或多次(可有可无,尽可能多匹配) | 正则a*b可匹配b、ab、aaab |
| + | 匹配1 次或多次(至少 1 次) | 正则a+b可匹配ab、aaab,不匹配b |
| ? | 匹配0 次或 1 次(最多 1 次,可选) | 正则a?b可匹配b、ab,不匹配aab |
| {n} | 匹配恰好 n 次(n 是数字) | 正则\\d{3}可匹配123、999(固定 3 位数字) |
| {n,} | 匹配至少 n 次(n 次及以上) | 正则\\d{2,}可匹配12、1234(2 位及以上数字) |
| {n,m} | 匹配n 到 m 次(包含 n 和 m) | 正则\\d{6,8}可匹配123456、12345678(6-8 位数字) |
✅ 经典例子:
- 匹配「任意位数的数字」:
\\d+(至少 1 位数字) - 匹配「6 位数字验证码」:
\\d{6}(恰好 6 位数字) - 匹配「3-10 位的用户名(字母 / 数字)」:
\\w{3,10}
4. 边界元字符
默认正则会从字符串中找任意位置的匹配内容 ,边界元字符可以限定「匹配必须在字符串的开头 / 结尾」,避免出现 "部分匹配" 的问题(比如验证手机号时,不能匹配13800138000abc这种带后缀的)。
| 边界元字符 | 大白话含义 | 例子 |
|---|---|---|
| ^ | 匹配字符串的开头 | 正则^abc只能匹配以 abc 开头 的字符串,如abc123,不匹配123abc |
| $ | 匹配字符串的结尾 | 正则abc$只能匹配以 abc 结尾 的字符串,如123abc,不匹配abc123 |
| ^...$ | 组合使用:整串匹配(字符串必须完全符合正则规则,不能多也不能少) | 正则^\\d{11}$:整串必须是 11 位数字(手机号核心规则) |
✅ 小白必知:做格式验证(手机号、邮箱、身份证)时,一定要用^...$整串匹配 ,否则会出现 "部分匹配成功" 的错误!比如用\\d{11}验证13800138000abc,会匹配到前面的 11 位数字,误以为验证通过,而^\\d{11}$会直接判定不匹配(因为字符串结尾有 abc)。
5. 特殊符号
(1)转义符\\
如果想匹配正则中的元字符本身 (比如.、*、$),因为这些符号有特殊含义,需要在前面加\\转义,Java 中就是\\\\。
- 例子: 匹配小数点
.,正则要写\\.(不是.);匹配*,正则要写\\*; - 经典场景: 匹配邮箱中的
@和.,比如xxx@xxx.com的正则中,.要写成\\.。
(2)或|
相当于逻辑中的或,分隔多个匹配规则,只要满足其中一个就匹配。
- 例子: 正则
a|b可匹配a或b;正则\\d|\\w可匹配数字或单词字符; - 场景: 匹配「手机号第二位(3-9)」可以写
3|4|5|6|7|8|9(后续会讲更简洁的写法)。
(3)分组()
默认正则的符号只作用于单个字符 ,用()可以把多个字符分组,让数量元字符、|作用于整个分组。
- 例子 1: 正则
(ab)+(ab 分组),可匹配ab、abab(至少 1 个 ab),而ab+只能匹配ab、abb(b 多次); - 例子 2: 正则
^(138|139)\\d{8}$,匹配138 或 139 开头的 11 位手机号 (138|139是分组,限定开头二选一)。
(4)字符集[]
用[]可以表示一组字符 ,匹配其中任意 1 个 ,比多个|更简洁,是小白必学的简化写法,核心规则:
[]中可以写单个字符 :[abc]匹配 a、b、c 中的任意 1 个;[]中可以写字符范围 :[0-9](等价\\d)、[a-z](小写字母)、[A-Z](大写字母)、[3-9](3 到 9 的数字);[]中元字符会失去特殊含义 :[.]直接匹配小数点,不用转义;[*]直接匹配 *;[]开头加^表示取反 :[^0-9]匹配非数字(等价\\D),[^a-z]匹配非小写字母。
✅ 经典例子(替换|,更简洁):
- 手机号第二位
3-9:[3-9](比3|4|5|6|7|8|9简洁 10 倍); - 匹配大小写字母:
[a-zA-Z]; - 匹配合法的密码字符(字母、数字、下划线、@):
[\\w@]。
三、Java 中使用正则的核心类
Java 没有把正则做成单独的语法,而是通过java.util.regex包中的2 个核心类实现正则的所有操作,不用记太多,这两个足够应对 99% 的场景,且用法超简单。
1. 核心类Pattern
作用:编译正则表达式 ,把字符串形式的正则(如^\\d{11}$)编译成程序能识别的「正则模式对象」,避免重复编译,提高效率。
- 常用方法:
Pattern.compile(String regex)→ 传入正则字符串,返回 Pattern 对象; - 特点:Pattern 类的构造方法是私有的 ,不能用
new创建,只能通过compile方法获取。
2. 核心类 Matcher
作用:将 Pattern 的正则模式应用到目标字符串,执行「匹配 / 提取 / 替换」操作,是实际干活的类。
- 获取方式: Pattern 对象的
matcher(String target)→ 传入目标字符串,返回 Matcher 对象; - 核心方法:
boolean matches():整串匹配 (等价于正则加^...$),判断目标字符串是否完全符合正则规则,适合格式验证(手机号、邮箱);boolean find():查找匹配 ,在目标字符串中找下一个 符合正则的子串,找到返回 true,否则 false,适合提取内容;String group():返回find()找到的匹配子串 ,必须先调用find(),否则报错;String replaceAll(String replacement):把目标字符串中所有 符合正则的子串替换成指定内容,适合批量替换(敏感词、去空格);String replaceFirst(String replacement):只替换第一个符合正则的子串。
3. 快捷方式:String 类的正则方法
Java 的String类直接提供了正则相关方法,底层还是调用 Pattern 和 Matcher,不用手动编译正则,适合简单场景(代码更简洁,小白首选),常用 3 个:
boolean matches(String regex):整串匹配,验证格式(如手机号、邮箱);String replaceAll(String regex, String replacement):批量替换;String[] split(String regex):按正则规则分割字符串,返回字符串数组。
✅ 建议:简单操作(验证、替换、分割)用 String 的方法,复杂操作(多次提取、循环匹配)用 Pattern+Matcher。
四、实战案例
理论不如实战,下面是工作 / 学习中最常用的正则场景,代码可直接复制运行,结合注释理解,看完就能上手。
案例 1:验证格式
需求 :判断字符串是否符合指定格式,用String.matches()最简洁。

案例 2:提取内容
需求 :从杂乱的字符串中提取符合规则的内容,用Pattern+Matcher的find()+group()。

案例 3:替换内容
需求 :批量替换字符串中的指定内容,用String.replaceAll()最简洁。

案例 4:分割字符串
需求 :按正则规则分割字符串,用String.split(),比普通的按固定字符分割更灵活。

五、常见坑
- 忘记转义
\:Java 中正则的\d要写成\\d,\s写成\\s,直接写\d会报编译错误; - 验证格式不用
^...$:比如验证手机号用\\d{11},会匹配13800138000abc,必须加^$整串匹配; - 匹配小数点不用转义 :直接写
.会匹配任意字符,匹配小数点本身要写\\.(字符集[]中除外,[.]可直接匹配); find()和matches()混淆 :matches()是整串匹配,find()是查找子串,提取内容用find(),验证格式用matches();- 分组引用错误 :
replaceAll()中引用分组用$1、$2(不是\1、\2),比如手机号脱敏$1****$2。
六、小技巧
- 忽略大小写 :编译正则时加
Pattern.CASE_INSENSITIVE,比如Pattern.compile("abc", Pattern.CASE_INSENSITIVE)可匹配ABC、aBc; - 非贪婪匹配 :数量元字符
*、+、{n,}默认是贪婪匹配 (尽可能多匹配),后面加?变成非贪婪匹配 (尽可能少匹配),比如正则a.*b匹配a1b2b会取a1b2b,a.*?b会取a1b; - 匹配换行 :
.默认不匹配换行\n,编译正则时加Pattern.DOTALL,让.匹配包括换行的所有字符; - 复杂邮箱验证 :基础邮箱正则
^\\w+@\\w+\\.\\w+$可拓展为^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$,支持多级域名(如test@vip.163.com)。
七、总结
- 正则是字符匹配的规则模板 ,Java 中通过
Pattern(编译正则)和Matcher(执行匹配)实现,简单场景直接用String的正则方法; - 必背核心符号 :
\\d(数字)、\\w(单词字符)、.(任意字符)、{n}(固定次数)、^$(整串匹配)、[](字符集); - Java 中正则的反斜杠必须转义 (
\→\\),匹配特殊符号(.、*)要加\\转义; - 三大核心操作:验证格式 (
matches()+^...$)、提取内容 (Pattern+Matcher+find()+group())、替换 / 分割 (replaceAll()/split()); - 避坑关键:验证加
^$、转义别忘\\、find()/matches()别用混。