Toolypet
Back to Blog
Dev

正则表达式速查表:常用模式大全

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

Toolypet Team4 min read
正则表达式速查表:常用模式大全

为什么要学正则表达式?

正则表达式(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-255
  • 2[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>' (只有第一个)

在量词后加 ? 变成懒惰匹配: *?, +?, ??

优化技巧

  1. 使用锚点: 用 ^$ 明确限制范围
  2. 使用具体的字符类: 用 [^<]* 代替 .* 进行限制
  3. 使用非捕获组: 不需要捕获时使用 (?:...)
// 捕获组 - 慢 (保存匹配结果)
/(abc)+/

// 非捕获组 - 快 (不保存)
/(?:abc)+/

不同语言的差异

功能JavaScriptPythonJava
语法/pattern/flagsr'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 中验证。

RegexRegular ExpressionValidationPattern Matching