为什么需要这份速查表
正则表达式(Regular Expression,简称 Regex)是文本处理的瑞士军刀,但它的语法密集、元字符繁多,即使经验丰富的开发者也常需查阅文档。本指南精选开发中最常用的校验模式,每个模式都附带解释和注意事项,帮你快速复用而非从零编写。
基础语法速览
| 符号 | 含义 | 示例 |
|---|---|---|
. |
任意单字符(除换行) | a.c → abc, a1c |
* |
前一项出现 0 次或多次 | ab* → a, ab, abbb |
+ |
前一项出现 1 次或多次 | ab+ → ab, abbb |
? |
前一项出现 0 或 1 次 | colou?r → color, colour |
{n} |
恰好 n 次 | \d{4} → 2025 |
{n,m} |
n 到 m 次 | \d{2,4} → 12, 123, 1234 |
^ |
字符串开头 | ^Hello |
$ |
字符串结尾 | world$ |
[...] |
字符集 | [aeiou] 匹配任一元音 |
[^...] |
否定字符集 | [^0-9] 匹配非数字 |
\d |
数字 [0-9] |
\d+ → 123 |
\w |
单词字符 [A-Za-z0-9_] |
\w+ → hello_1 |
\s |
空白字符 | 空格、Tab、换行 |
(...) |
捕获组 | 提取匹配的部分 |
(?:...) |
非捕获组 | 分组但不捕获 |
(?=...) |
正向先行断言 | 向前看但不消费 |
(?!...) |
负向先行断言 | 向前看且不匹配 |
常用校验模式
1. 邮箱地址
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
解释:
^[a-zA-Z0-9._%+-]+:用户名部分,允许字母、数字及._%+-@:必须有 @ 符号[a-zA-Z0-9.-]+:域名部分\.[a-zA-Z]{2,}$:顶级域名至少 2 个字母
注意:此正则覆盖 99% 的常见邮箱,但不完全符合 RFC 5322 规范(RFC 邮箱规则极其复杂,实用中不推荐完全遵循)。实际项目中建议发送验证邮件确认,而非依赖正则完美校验。
2. 手机号(中国大陆)
^1[3-9]\d{9}$
解释:
^1:以 1 开头[3-9]:第二位为 3-9(覆盖移动、联通、电信所有号段)\d{9}$:后跟 9 位数字,共 11 位
国际化手机号建议使用 Google 的 libphonenumber 库,而非手写正则。
3. URL
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$
解释:
https?:匹配 http 或 https\/\/:协议分隔符//(www\.)?:可选的 www 子域[-a-zA-Z0-9@:%._\+~#=]{1,256}:域名主体\.[a-zA-Z0-9()]{1,6}:顶级域名- 最后的捕获组匹配路径和查询参数
4. IPv4 地址
^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$
解释:
25[0-5]:匹配 250-2552[0-4]\d:匹配 200-2491\d\d:匹配 100-199[1-9]?\d:匹配 0-99- 上述四选一组匹配一个 0-255 的数字,重复 4 次用
.分隔
5. IPv6 地址(简化版)
^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
注意:IPv6 支持压缩格式(::),完整校验非常复杂。生产环境建议使用专用库。
6. 日期格式(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
解释:
\d{4}:四位年份(0[1-9]|1[0-2]):月份 01-12(0[1-9]|[12]\d|3[01]):日期 01-31
注意:此正则不校验月份与天数的逻辑关系(如 2 月 30 日会通过),精确校验应使用日期库。
7. 十六进制颜色
^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
解释:匹配 3 位或 6 位十六进制颜色,# 可选。
8. 密码强度(至少 8 位,含大小写字母和数字)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$
解释:
(?=.*[a-z]):正向先行断言,确保包含小写字母(?=.*[A-Z]):确保包含大写字母(?=.*\d):确保包含数字[A-Za-z\d@$!%*?&]{8,}:最终匹配至少 8 位允许字符
9. 中国身份证号(18 位)
^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$
解释:
[1-9]\d{5}:6 位地区码(19|20)\d{2}:4 位年份(19xx 或 20xx)(0[1-9]|1[0-2]):月份(0[1-9]|[12]\d|3[01]):日期\d{3}:3 位顺序码[\dXx]:校验位,可能为 X
10. 提取所有链接
https?:\/\/[^\s]+
用于从文本中快速抓取所有 HTTP/HTTPS 链接。
各语言使用示例
JavaScript
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const isValid = emailRegex.test('user@example.com'); // true
const matches = 'Visit https://example.com and https://oltools.com'
.match(/https?:\/\/[^\s]+/g);
Python
import re
email_re = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
is_valid = bool(re.match(email_re, 'user@example.com'))
urls = re.findall(r'https?://[^\s]+', 'Visit https://example.com')
Java
Pattern emailPattern = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
boolean isValid = emailPattern.matcher("user@example.com").matches();
Go
var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
isValid := emailRegex.MatchString("user@example.com")
性能与最佳实践
- 避免灾难性回溯:嵌套量词如
(a+)+在特定输入下会导致指数级回溯,使正则引擎卡死 - 预编译正则:在循环中使用正则时,先
compile再复用 - 使用非捕获组:不需要提取的分组用
(?:...)替代(...),提升性能 - 锚定边界:合理使用
^和$或\b,避免意外部分匹配 - 测试边界用例:空字符串、超长输入、Unicode 字符都要测试
- 不要用正则解析 HTML/XML:使用专用解析器,正则无法正确处理嵌套结构
在线调试工具推荐
- regex101.com:可视化匹配、解释每个符号、支持多引擎
- regexr.com:交互式编辑与速查
- 各语言官方文档中的正则章节