← 返回博客首页

正则表达式速查表:常用模式与实战示例

为什么需要这份速查表

正则表达式(Regular Expression,简称 Regex)是文本处理的瑞士军刀,但它的语法密集、元字符繁多,即使经验丰富的开发者也常需查阅文档。本指南精选开发中最常用的校验模式,每个模式都附带解释和注意事项,帮你快速复用而非从零编写。

基础语法速览

符号 含义 示例
. 任意单字符(除换行) a.cabc, a1c
* 前一项出现 0 次或多次 ab*a, ab, abbb
+ 前一项出现 1 次或多次 ab+ab, abbb
? 前一项出现 0 或 1 次 colou?rcolor, 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-255
  • 2[0-4]\d:匹配 200-249
  • 1\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:交互式编辑与速查
  • 各语言官方文档中的正则章节
← 返回博客首页