火星科技网您的位置:首页 >科普解惑 > 知识分享 >

java 正则表达式详解 语法规则与 API 使用深度讲解

导读 java 正则表达式是一套字符串匹配规则,依靠特殊符号编写模式,实现校验、查找、替换、提取字符串,底层由 Pattern 和 Matcher 两个核

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 讲解,正则引擎不同语言细节存在差异,业务编写正则建议充分测试边界场景,内容仅作为学习开发参考。