正则表达式速查表:常用模式大全
整理 Web 开发中最常用的正则表达式模式和应用示例。

为什么要学正则表达式?
正则表达式(Regular Expression, Regex)对于开发者来说就像瑞士军刀一样。虽然一开始会觉得困难,但一旦熟悉后,可以用一行代码替代数十行字符串处理代码。在邮箱验证、电话号码提取、日志解析、文本替换等几乎所有字符串处理工作中,正则表达式都能大放异彩。
很多开发者害怕正则表达式,是因为它的语法一眼看不懂。像 /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ 这样的代码看起来就像密文一样。但只要理解基本语法,这个模式也能逻辑清晰地读懂。本文将首先说明正则表达式的核心语法,然后逐一拆解实务中常用的模式。
系统理解基本语法
正则表达式的语法大致可分为四类:元字符、量词、分组、锚点。
元字符:具有特殊含义的字符
元字符表示特定的字符集合或条件。
| 符号 | 含义 | 示例 |
|---|---|---|
. | 除换行符外的任意字符 | a.c → abc, adc, a1c |
\d | 数字 (0-9) | \d+ → 123, 4567 |
\D | 非数字字符 | \D+ → abc, !@# |
\w | 单词字符 (a-z, A-Z, 0-9, _) | \w+ → hello_123 |
\W | 非单词字符 | \W → 空格, 特殊字符 |
\s | 空白字符 (空格, Tab, 换行) | \s+ → 多个空格 |
\S | 非空白字符 | \S+ → 连续的单词 |
量词:表示重复
量词指定前面的元素重复多少次。
| 符号 | 含义 | 示例 |
|---|---|---|
* | 0个或更多 | ab* → a, ab, abb, abbb |
+ | 1个或更多 | ab+ → ab, abb, abbb |
? | 0个或1个 | colou?r → color, colour |
{n} | 恰好n个 | \d{4} → 2025 |
{n,} | n个或更多 | \d{2,} → 10, 100, 1000 |
{n,m} | n个到m个 | \d{2,4} → 10, 100, 1000 |
锚点和边界
锚点匹配的不是字符本身,而是位置。
| 符号 | 含义 | 示例 |
|---|---|---|
^ | 字符串开头 | ^Hello → "Hello World" 匹配 |
$ | 字符串结尾 | World$ → "Hello World" 匹配 |
\b | 单词边界 | \bcat\b → 只匹配 "cat", 不匹配 "catch" |
\B | 非单词边界 | \Bcat → "catch" 中的 cat |
分组和捕获
使用括号可以对模式进行分组,并捕获匹配的部分。
const dateStr = '2025-12-25';
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const match = dateStr.match(regex);
console.log(match[0]); // '2025-12-25' (完整匹配)
console.log(match[1]); // '2025' (第一组 - 年)
console.log(match[2]); // '12' (第二组 - 月)
console.log(match[3]); // '25' (第三组 - 日)
实战模式大全:逐一拆解
1. 邮箱验证
邮箱模式是正则表达式的经典例子。让我们逐步拆解。
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
模式拆解:
^- 字符串开头[a-zA-Z0-9._%+-]+- 本地部分 (@ 前面): 字母、数字、点、下划线等1个或更多@- @ 符号 (字面量)[a-zA-Z0-9.-]+- 域名: 字母、数字、点、连字符1个或更多\.- 点 (需要转义)[a-zA-Z]{2,}- 顶级域名: 字母2个或更多 (com, cn, museum 等)$- 字符串结尾
边界情况处理:
这个模式可以验证大多数常见邮箱,但并不完全遵循 RFC 5322 标准。例如包含引号的邮箱 "user name"@example.com 不会匹配。在实际工作中,格式验证后通过实际发送邮件确认是最可靠的方式。
2. 密码强度检查
要用正则表达式验证复杂的密码规则,需要使用前瞻断言(Lookahead)。
// 最少8位,包含大小写字母、数字、特殊字符
const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
模式拆解:
(?=.*[a-z])- 必须包含至少1个小写字母 (前瞻断言)(?=.*[A-Z])- 必须包含至少1个大写字母(?=.*\d)- 必须包含至少1个数字(?=.*[@$!%*?&])- 必须包含至少1个特殊字符[A-Za-z\d@$!%*?&]{8,}- 允许的字符组成8位或更多
前瞻断言 (?=...) 检查该模式是否存在,但不实际消耗字符。这样可以同时检查多个条件。
3. 电话号码验证
验证中国手机号码的模式。
const phoneRegex = /^1[3-9]\d{9}$/;
模式拆解:
1- 以1开头[3-9]- 第二位是3-9\d{9}- 后面9位数字
phoneRegex.test('13812345678'); // true
phoneRegex.test('12812345678'); // false (第二位无效)
phoneRegex.test('1381234567'); // false (位数不足)
4. 中文姓名验证
验证中文姓名时使用中文 Unicode 范围。
const chineseNameRegex = /^[\u4e00-\u9fa5]{2,5}$/;
chineseNameRegex.test('张三'); // true
chineseNameRegex.test('王'); // false (少于2个字)
chineseNameRegex.test('Zhang'); // false (英文)
[\u4e00-\u9fa5] 表示常用汉字范围。
5. URL 验证
URL 模式需要支持各种格式,所以比较复杂。
const urlRegex = /^(https?:\/\/)?(www\.)?[\w-]+(\.[a-z]{2,})+([\/\w.-]*)*\/?$/i;
模式拆解:
(https?:\/\/)?- 协议 (http:// 或 https://) 可选(www\.)?- www. 可选[\w-]+- 域名(\.[a-z]{2,})+- .com, .cn 等顶级域名 (1个或更多)([\/\w.-]*)*- 路径 (可选)\/?$- 末尾斜杠可选i标志 - 忽略大小写
6. IPv4 地址验证
IPv4 地址的每个八位字节必须在 0-255 范围内。用正则表达式表示:
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
模式拆解 (0-255 匹配):
25[0-5]- 250-2552[0-4]\d- 200-249[01]?\d\d?- 0-199
ipv4Regex.test('192.168.1.1'); // true
ipv4Regex.test('256.1.1.1'); // false (256超出范围)
ipv4Regex.test('192.168.001.001'); // true (允许前导0)
性能优化
正则表达式变慢的最大原因是回溯(Backtracking)。贪婪量词过度使用时性能会急剧下降。
贪婪 vs 懒惰量词
// 贪婪 (Greedy) - 尽可能多地匹配
'<div>content</div><div>more</div>'.match(/<div>.*<\/div>/);
// 结果: '<div>content</div><div>more</div>' (全部)
// 懒惰 (Lazy) - 尽可能少地匹配
'<div>content</div><div>more</div>'.match(/<div>.*?<\/div>/);
// 结果: '<div>content</div>' (只有第一个)
在量词后加 ? 变成懒惰匹配: *?, +?, ??
优化技巧
- 使用锚点: 用
^和$明确限制范围 - 使用具体的字符类: 用
[^<]*代替.*进行限制 - 使用非捕获组: 不需要捕获时使用
(?:...)
// 捕获组 - 慢 (保存匹配结果)
/(abc)+/
// 非捕获组 - 快 (不保存)
/(?:abc)+/
不同语言的差异
| 功能 | JavaScript | Python | Java |
|---|---|---|---|
| 语法 | /pattern/flags | r'pattern' | Pattern.compile("pattern") |
| Unicode | /u 标志 | 默认支持 | Pattern.UNICODE_CASE |
| 命名组 | (?<name>...) | (?P<name>...) | (?<name>...) |
| 前瞻断言 | 支持 | 支持 | 支持 |
| 后顾断言 | 可变长度限制 | 支持 | 支持 |
JavaScript 中使用正则表达式
const str = 'Contact us at support@example.com or sales@example.com';
const regex = /[\w.-]+@[\w.-]+\.\w+/g;
// 查找所有匹配
const emails = str.match(regex);
// ['support@example.com', 'sales@example.com']
// 替换
const masked = str.replace(regex, '[邮箱已隐藏]');
// 'Contact us at [邮箱已隐藏] or [邮箱已隐藏]'
// 分割
'a,b;c:d'.split(/[,;:]/);
// ['a', 'b', 'c', 'd']
// 迭代匹配 (matchAll)
for (const match of str.matchAll(/(\w+)@(\w+\.\w+)/g)) {
console.log(`本地部分: ${match[1]}, 域名: ${match[2]}`);
}
Toolypet Regex Tester 使用
编写正则表达式最困难的一点是难以获得即时反馈。Toolypet 的 Regex Tester 解决了这个问题:
- 输入模式和测试字符串后实时查看匹配结果
- 可视化显示每个捕获组匹配了什么
- 通过切换按钮方便地测试各种标志(g, i, m)
- 提供常用模式模板
调试复杂的正则表达式时,比在代码中直接测试更高效的方式是先在 Toolypet 中验证。