Java 正则表达式知识点总结

正则表达式(简称正则 / Regex )就是一套字符匹配的规则模板,用简单的符号组合,就能快速实现「判断字符串是否符合规则」「提取字符串中符合规则的内容」「替换字符串中指定内容」等操作,比如验证手机号、邮箱格式,提取文本中的所有数字,替换敏感词等。

Java 中专门提供了java.util.regex包来支持正则,核心只需要掌握正则基础语法 +Java 中 2 个核心类的使用

一、正则的核心思想

你可以把正则想象成 "字符串的筛选器":

  • 你用「正则符号」写好筛选规则(比如 "必须是 11 位数字");
  • 把这个规则套在目标字符串上(比如 "13800138000");
  • 程序根据规则判断匹配 / 不匹配 ,或执行提取 / 替换

比如验证手机号的正则^1[3-9]\\d{9}$,就是告诉程序:字符串必须以 1 开头,第二位是 3-9 的数字,后面跟 9 个数字,且整个字符串只有这些内容。

二、正则的 "匹配符号"

正则的核心就是各种匹配符号 ,分为「普通字符」和「元字符」,元字符是正则的精髓,也是小白最需要记的,下面按使用频率排序,记熟这些就能解决 80% 的问题。

1. 普通字符

就是平时的字母、数字、汉字、符号(如a-z0-9@),正则中写什么,就匹配字符串中的什么。

  • 例子:正则abc,只能匹配字符串abc,不匹配ababcdaBc(正则默认区分大小写)。

2. 核心元字符

这些符号有特殊含义,能匹配某一类符合条件的字符 ,不用逐个写,是正则简化书写的关键,Java 中反斜杠 \ 需要转义成 \

元字符 大白话含义 例子
. 匹配任意 1 个字符(除了换行 \n) 正则a.b可匹配a1ba@baab
\\d 匹配任意 1 个数字(0-9) 正则\\d\\d可匹配1299
\\D 匹配任意 1 个非数字 正则\\D可匹配a@
\\w 匹配任意 1 个单词字符(字母 / 数字 / 下划线),汉字也能匹配 正则\\w可匹配A5_
\\W 匹配任意 1 个非单词字符 正则\\W可匹配@+空格
\\s 匹配任意 1 个空白字符(空格、制表符 \t、换行 \n) 正则a\\sb可匹配a ba\tb
\\S 匹配任意 1 个非空白字符 正则\\S可匹配1a@

✅ 重点提醒:Java 中所有带\的正则符号,都要写成\\(因为 Java 字符串中\本身需要转义),比如数字是\\d不是\d

3. 数量元字符

上面的元字符只能匹配1 个 字符,数量元字符可以指定匹配多次,写在「要限定次数的字符 / 元字符」后面,是实现 "多字符匹配" 的核心

数量元字符 大白话含义 例子
* 匹配0 次或多次(可有可无,尽可能多匹配) 正则a*b可匹配babaaab
+ 匹配1 次或多次(至少 1 次) 正则a+b可匹配abaaab,不匹配b
? 匹配0 次或 1 次(最多 1 次,可选) 正则a?b可匹配bab,不匹配aab
{n} 匹配恰好 n 次(n 是数字) 正则\\d{3}可匹配123999(固定 3 位数字)
{n,} 匹配至少 n 次(n 次及以上) 正则\\d{2,}可匹配121234(2 位及以上数字)
{n,m} 匹配n 到 m 次(包含 n 和 m) 正则\\d{6,8}可匹配12345612345678(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可匹配ab;正则\\d|\\w可匹配数字或单词字符;
  • 场景: 匹配「手机号第二位(3-9)」可以写3|4|5|6|7|8|9(后续会讲更简洁的写法)。

(3)分组()

默认正则的符号只作用于单个字符 ,用()可以把多个字符分组,让数量元字符、|作用于整个分组。

  • 例子 1: 正则(ab)+(ab 分组),可匹配ababab(至少 1 个 ab),而ab+只能匹配ababb(b 多次);
  • 例子 2: 正则^(138|139)\\d{8}$,匹配138 或 139 开头的 11 位手机号138|139是分组,限定开头二选一)。

(4)字符集[]

[]可以表示一组字符 ,匹配其中任意 1 个 ,比多个|更简洁,是小白必学的简化写法,核心规则:

  1. []中可以写单个字符[abc]匹配 a、b、c 中的任意 1 个;
  2. []中可以写字符范围[0-9](等价\\d)、[a-z](小写字母)、[A-Z](大写字母)、[3-9](3 到 9 的数字);
  3. []元字符会失去特殊含义[.]直接匹配小数点,不用转义;[*]直接匹配 *;
  4. []开头加^表示取反[^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 对象;
  • 核心方法:
    1. boolean matches()整串匹配 (等价于正则加^...$),判断目标字符串是否完全符合正则规则,适合格式验证(手机号、邮箱);
    2. boolean find()查找匹配 ,在目标字符串中找下一个 符合正则的子串,找到返回 true,否则 false,适合提取内容
    3. String group():返回find()找到的匹配子串 ,必须先调用find(),否则报错;
    4. String replaceAll(String replacement):把目标字符串中所有 符合正则的子串替换成指定内容,适合批量替换(敏感词、去空格);
    5. String replaceFirst(String replacement):只替换第一个符合正则的子串。

3. 快捷方式:String 类的正则方法

Java 的String类直接提供了正则相关方法,底层还是调用 Pattern 和 Matcher,不用手动编译正则,适合简单场景(代码更简洁,小白首选),常用 3 个:

  1. boolean matches(String regex):整串匹配,验证格式(如手机号、邮箱);
  2. String replaceAll(String regex, String replacement):批量替换;
  3. String[] split(String regex):按正则规则分割字符串,返回字符串数组。

✅ 建议:简单操作(验证、替换、分割)用 String 的方法,复杂操作(多次提取、循环匹配)用 Pattern+Matcher。

四、实战案例

理论不如实战,下面是工作 / 学习中最常用的正则场景,代码可直接复制运行,结合注释理解,看完就能上手。

案例 1:验证格式

需求 :判断字符串是否符合指定格式,用String.matches()最简洁。

案例 2:提取内容

需求 :从杂乱的字符串中提取符合规则的内容,用Pattern+Matcherfind()+group()

案例 3:替换内容

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

案例 4:分割字符串

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

五、常见坑

  1. 忘记转义\ :Java 中正则的\d要写成\\d\s写成\\s,直接写\d会报编译错误;
  2. 验证格式不用^...$ :比如验证手机号用\\d{11},会匹配13800138000abc,必须加^$整串匹配;
  3. 匹配小数点不用转义 :直接写.会匹配任意字符,匹配小数点本身要写\\.(字符集[]中除外,[.]可直接匹配);
  4. find()matches()混淆matches()是整串匹配,find()是查找子串,提取内容用find(),验证格式用matches()
  5. 分组引用错误replaceAll()中引用分组用$1$2(不是\1\2),比如手机号脱敏$1****$2

六、小技巧

  1. 忽略大小写 :编译正则时加Pattern.CASE_INSENSITIVE,比如Pattern.compile("abc", Pattern.CASE_INSENSITIVE)可匹配ABCaBc
  2. 非贪婪匹配 :数量元字符*+{n,}默认是贪婪匹配 (尽可能多匹配),后面加?变成非贪婪匹配 (尽可能少匹配),比如正则a.*b匹配a1b2b会取a1b2ba.*?b会取a1b
  3. 匹配换行.默认不匹配换行\n,编译正则时加Pattern.DOTALL,让.匹配包括换行的所有字符;
  4. 复杂邮箱验证 :基础邮箱正则^\\w+@\\w+\\.\\w+$可拓展为^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$,支持多级域名(如test@vip.163.com)。

七、总结

  1. 正则是字符匹配的规则模板 ,Java 中通过Pattern(编译正则)和Matcher(执行匹配)实现,简单场景直接用String的正则方法;
  2. 必背核心符号\\d(数字)、\\w(单词字符)、.(任意字符)、{n}(固定次数)、^$(整串匹配)、[](字符集);
  3. Java 中正则的反斜杠必须转义\\\),匹配特殊符号(.*)要加\\转义;
  4. 三大核心操作:验证格式matches()+^...$)、提取内容Pattern+Matcher+find()+group())、替换 / 分割replaceAll()/split());
  5. 避坑关键:验证加^$、转义别忘\\find()/matches()别用混。
相关推荐
indexsunny2 小时前
互联网大厂Java面试实战:微服务与Spring生态技术解析
java·spring boot·redis·kafka·mybatis·hibernate·microservices
小疙瘩2 小时前
去掉 IDEA 中 mybatis配置文件的局部背景颜色(图解)
java·ide·intellij-idea
xqqxqxxq2 小时前
洛谷算法1-3 暴力枚举(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
逝水如流年轻往返染尘2 小时前
正则表达式字符串
java·正则表达式
LYS_06182 小时前
寒假学习(14)(HAL库5)
java·linux·学习
qq_336313932 小时前
javaweb-maven单元测试
java·开发语言·maven
消失的旧时光-19432 小时前
第十三课实战版:权限系统实战:RBAC + Spring Security 从 0 到可用(含核心代码)
java·架构·rbac
Jaxson Lin2 小时前
Java编程进阶:智能仿真无人机项目4.0
java·开发语言·无人机
Remember_9932 小时前
MySQL 索引详解:从原理到实战优化
java·数据库·mysql·spring·http·adb·面试