java 正则表达式详解 语法规则与 API 使用深度讲解
java 正则表达式是一套字符串匹配规则,依靠特殊符号编写模式,实现校验、查找、替换、提取字符串,底层由 Pattern 和 Matcher 两个核心类完成解析匹配,String 类也内置 matches、replaceAll、split 方法直接调用正则。之所以项目里面大量使用 java 正则表达式,是因为手机号、身份证、邮箱、密码格式校验这类需求,写普通循环判断代码非常繁琐,正则可以用一行模式完成复杂规则匹配,在表单校验、日志解析、文本清洗场景非常常用。学习的时候一般先掌握元字符、量词、分组、边界这些基础语法,然后理解 Pattern 编译和 Matcher 匹配流程,再练习全匹配、查找、替换、捕获分组这几种常用操作,最后处理转义、贪婪匹配、性能这类易错点,每一条正则都要在 java 代码里面测试验证。掌握之后就可以独立编写业务正则,同时理解面试里面正则相关考点,注意 java 代码里面反斜杠需要双写转义,这是新手最容易踩坑的地方。
一 核心元字符
表格
| 符号 | 含义 |
|---|---|
| . | 匹配除换行符之外任意单个字符 |
| \d | 匹配数字 0 到 9 |
| \D | 匹配非数字 |
| \w | 匹配字母数字下划线 |
| \W | 匹配非字母数字下划线 |
| \s | 匹配空白字符 空格 制表符 换行 |
| \S | 匹配非空白字符 |
| [] | 字符集合,匹配括号内任意一个字符 |
| [^] | 取反,匹配不在集合内字符 |
二 量词(重复匹配)
清单
1 匹配前面元素零次或者多次
2 + 匹配前面元素一次或者多次
3 ? 匹配前面元素零次或者一次
4 {n} 固定匹配 n 次
5 {n,} 至少匹配 n 次
6 {n,m} 匹配 n 到 m 次
7 贪婪匹配 默认贪婪,尽可能多匹配,后面加?变成非贪婪惰性匹配
三 边界与分组
清单
1 ^ 字符串开始位置
2 $ 字符串结束位置
3 | 或,多分支匹配
4 () 捕获分组,分组匹配之后可以提取组内内容
5 (?:) 非捕获分组,只分组不保存组号
6 \b 单词边界
四 java 正则核心 API
清单
1 String.matches () 全字符串匹配,判断整个字符串是否符合正则,返回 boolean,适合格式校验
2 String.replaceAll () 按照正则匹配内容替换
3 String.split () 按照正则分隔字符串
4 Pattern.compile () 编译正则模式,适合多次复用正则,提升性能
5 Matcher 匹配器,支持 find 查找下一处匹配,group 提取分组,start end 获取匹配下标
五 常用业务正则示例
清单
1 手机号 ^1 [3-9]\d {9}$
2 邮箱 ^\w+@\w+.\w+$
3 纯数字 ^\d+$
4 密码 大小写字母加数字 长度 6 到 16 位 ^[A-Za-z0-9]{6,16}$
六 重点易错知识点
清单
1 java 字符串里面 \ 要写成 \,比如 \d 在 java 代码写为 "\d"
2 matches 是全匹配,不是局部查找,这点和 find 区分,很多新手混淆
3 贪婪匹配容易匹配过多内容,需要改成惰性匹配
4 特殊字符 . + ? () [] ^ $ 本身有含义,需要匹配原字符要加转义
5 频繁重复编译 Pattern 会消耗性能,固定正则建议提前 compile 缓存
七 三种匹配模式补充
清单
1 全匹配 整个字符串必须完全符合正则
2 局部查找 Matcher.find,在长文本里面查找符合规则片段
3 替换捕获分组 replaceAll 可以引用分组内容做替换
【常见问题】
问题 1 java 正则表达式 matches 和 find 有什么区别
回答 1 java 正则表达式里面 matches 要求整个字符串全部匹配成功,find 是在字符串内部查找局部匹配片段,做表单校验一般用 matches,文本提取内容一般使用 Matcher 的 find 方法。
问题 2 java 正则为什么 \d 要写成 \d
回答 1 java 正则表达式在字符串字面量里面,单个反斜杠本身属于 java 转义字符,所以正则的 \d 必须写成 \d,编译器解析之后才会变成正则识别的 \d,这是 java 正则最常见新手错误。
问题 3 java 正则贪婪匹配是什么意思
回答 1 java 正则贪婪匹配是量词默认特性,会尽可能匹配最长内容,如果想要最短匹配,在量词后面加上问号变成惰性匹配,处理文本提取的时候经常需要调整贪婪模式。
问题 4 多次使用同一个正则推荐怎么做
回答 1 多次复用 java 正则推荐使用 Pattern.compile 提前编译,不要反复调用 String 的正则方法重复编译,这样可以提升程序性能,适合循环大批量文本处理场景。
【免责申明】
本文内容为 java 正则表达式基础语法与 API 讲解,正则引擎不同语言细节存在差异,业务编写正则建议充分测试边界场景,内容仅作为学习开发参考。
