前言
在 java 开发中,字符串处理是高频需求 —— 小到验证用户输入的手机号,大到从海量日志中提取关键信息,传统方法往往需要写大量代码反复判断,效率低下且易出错。而正则表达式,正是解决这类问题的高效工具。今天这篇文章,就从基础概念到 java 实战,带你彻底搞懂正则表达式。
一、什么是正则表达式?
正则表达式(regular expression,简称 regex 或 regexp),本质是一套描述字符串模式的规则集合。它用特定的字符和符号,定义 “什么样的字符串符合要求”,就像给字符串画了一个 “模板”,我们可以用这个模板快速完成匹配、查找、替换等操作。
简单来说,正则表达式的核心是 “按规则找字符串”—— 比如判断 “这个字符串是不是邮箱”,或 “从这段文字里把所有日期挑出来”。
二、正则表达式的核心作用
正则表达式的应用场景几乎覆盖所有字符串处理需求,最常用的有四类:
- 格式验证:判断字符串是否符合预设格式,比如验证手机号、邮箱、身份证号是否合法;
- 内容提取:从复杂文本中筛选出符合规则的内容,比如从日志里提取 ip 地址,从文章里提取 url 链接;
- 批量替换:统一修改文本中符合规则的内容,比如把文本里所有 “2023 年” 替换成 “2024 年”,或清除字符串中的所有空格;
- 字符串分割:按自定义规则分割字符串,比如按 “逗号或分号” 分割一个列表,而不是只能按固定字符分割。
三、正则表达式的基础语法
正则表达式的语法由 “普通字符” 和 “元字符” 组成,普通字符代表自身,元字符则是具有特殊含义的符号 —— 掌握元字符,就掌握了正则的核心。
1. 普通字符
大部分字符在正则中直接匹配自身,比如:
- 输入
a,就匹配字符a; - 输入
abc,就匹配字符串abc; - 输入
123,就匹配字符串123。
2. 核心元字符(必学)
元字符是正则的 “灵魂”,不同元字符对应不同的匹配规则,以下是最常用的 12 个:
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符 \n) | a.b 可匹配 aab、acb、a1b |
\d | 匹配任意数字(0-9) | \d\d 可匹配 12、34 等两位数字 |
\w | 匹配字母、数字或下划线(a-z、a-z、0-9、_) | \w+ 可匹配 name123、user_456 |
* | 前面的元素出现 0 次或多次 | ab* 可匹配 a、ab、abb |
+ | 前面的元素出现 1 次或多次 | \d+ 可匹配 1、12、123(至少 1 个数字) |
? | 前面的元素出现 0 次或 1 次 | colou?r 可匹配 color 或 colour(u 可选) |
{n} | 前面的元素恰好出现 n 次 | \d{3} 可匹配 123、456 等 3 位数字 |
{n,} | 前面的元素至少出现 n 次 | \d{2,} 可匹配 12、123、1234 |
[] | 字符集,匹配其中任意一个字符 | [abc] 可匹配 a、b 或 c;[0-9] 等价于 \d |
() | 分组,将多个元素视为一个整体 | (ab)+ 可匹配 ab、abab、ababab |
^ | 匹配字符串的开头 | ^hello 可匹配 hello world(以 hello 开头) |
$ | 匹配字符串的结尾 | world$ 可匹配 hello world(以 world 结尾) |
3. 关键提醒:转义字符
如果需要匹配元字符本身(比如 .、*、( 这些有特殊含义的符号),必须用 \ 转义。例如:
- 要匹配
.,需写成\.(否则.会匹配任意字符); - 要匹配
*,需写成\*。
特别注意:在 java 字符串中,\ 本身需要再次转义,所以正则中的 \d 在 java 代码里要写成 \\d,\. 要写成 \\.—— 这是初学者最容易踩的坑。
四、实用场景示例:从理论到实践
光看语法容易抽象,结合具体场景理解,才能更快上手。以下是 3 个 java 开发中最常见的场景:
1. 场景 1:验证中国大陆手机号
规则:11 位数字,以 13、14、15、17、18、19 开头。
正则表达式:^1[345789]\\d{9}$(java 中需转义 \)
拆解:
^1:字符串必须以 1 开头;[345789]:第二位是 3、4、5、7、8、9 中的任意一个;\\d{9}:后面跟 9 位数字(确保总长度 11 位);$:字符串必须在这里结束(避免出现 “13812345678abc” 这类无效字符串)。
2. 场景 2:验证邮箱格式
规则:包含 @ 和 .,@ 前是用户名(可含字母、数字、下划线、点),@ 后是域名(如 xxx.com、xxx.cn)。
正则表达式:^[\\w.-]+@[a-za-z0-9-]+\\.[a-za-z0-9.]+$
拆解:
[\\w.-]+:用户名部分,允许字母、数字、下划线、点、减号,至少 1 位;@:必须包含@符号;[a-za-z0-9-]+:域名前缀,允许字母、数字、减号,至少 1 位(如qq、163、baidu);\\.[a-za-z0-9.]+:域名后缀(如.com、.co.uk),必须以.开头。
3. 场景 3:提取文本中的日期(yyyy-mm-dd 格式)
规则:4 位年份 + - + 2 位月份 + - + 2 位日期(简化版,暂不考虑月份 1-12、日期 1-31 的严格校验)。
正则表达式:\\d{4}-\\d{2}-\\d{2}
效果:从文本 2023-10-01是国庆节,2024-01-01是元旦,2024-02-14是情人节 中,可提取出 2023-10-01、2024-01-01、2024-02-14。
五、java 中如何实现正则表达式?
核心方式:pattern + matcher
pattern 负责编译正则表达式(预编译后可重复使用,提升性能),matcher 负责基于编译后的模式,对字符串执行匹配操作。
示例:验证手机号是否合法

示例:提取文本中的所有日期

简化方式:string 类的正则方法
如果场景简单(无需重复使用正则、无需多次匹配),可以直接用 string 类的 3 个常用方法,省去创建 pattern 和 matcher 的步骤:
| 方法 | 作用 | 示例 | |
|---|---|---|---|
matches(string regex) | 判断字符串是否完全匹配正则 | "13812345678".matches("^1[345789]\\d{9}$") → true | |
replaceall(string regex, string replacement) | 替换所有匹配的内容 | "abc123def".replaceall("\\d+", "***") → "abc***def" | |
split(string regex) | 按正则规则分割字符串 | `"a,b;c,d".split(",;")→ 数组["a","b","c","d"]` |
六、初学者必避的 3 个坑
- 转义符漏写:java 中必须用
\\表示正则的\,比如\d要写成\\d,少写一个\会直接报错; - 贪婪匹配问题:
*、+、?默认是 “贪婪模式”(尽可能匹配更长的内容),如果需要 “非贪婪模式”(尽可能短),可在后面加?。例如a.*b匹配aabxb中的aabxb,而a.*?b只匹配aab; - 性能浪费:如果同一个正则需要多次使用(比如在循环中验证手机号),一定要提前编译成
pattern对象,避免每次循环都重新编译 —— 编译正则的开销远大于匹配的开销。
七、总结
正则表达式不是 “高深技术”,而是 “高效工具”—— 它用简洁的规则,替代了大量重复的字符串判断代码,让字符串处理效率翻倍。
对于 java 学习者来说,掌握正则的核心是:先记住常用元字符的含义,再结合实际场景(验证、提取、替换)多练,最后通过 pattern、matcher 或 string 类的方法落地到代码中。
到此这篇关于正则表达式规则、示例与java实现代码的文章就介绍到这了,更多相关正则表达式规则与java实现内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论