正在加载,请稍候…

正则表达式速查表:每个你真正会用到的模式

一份实用的正则表达式参考,包含电子邮件、URL、密码、日期、IP地址等真实世界模式,附有语法表和JavaScript、Python等语言的工作代码示例

正则表达式速查表:每个你真正会用到的模式

正则表达式语法快速参考

正则表达式使用紧凑的语法,大多数字符匹配自身,但某些字符具有特殊含义。

正则表达式速查表:每个你真正会用到的模式 插图

字符类

模式 匹配
. 除换行符外的任何字符
\w 单词字符:[a-zA-Z0-9_]
\W 非单词字符
\d 数字:[0-9]
\D 非数字
\s 空白字符(空格、制表符、换行符)
\S 非空白字符
[abc] a、b 或 c 中的任意一个
[^abc] 除 a、b、c 之外的任何字符
[a-z] 任何小写字母
[A-Z] 任何大写字母
[0-9] 任何数字(同 \d)
[a-zA-Z] 任何字母

量词

模式 匹配
* 0 次或多次
+ 1 次或多次
? 0 次或 1 次(可选)
{n} 恰好 n 次
{n,} n 次或更多次
{n,m} 介于 n 和 m 次之间
*? 0 次或多次(懒惰)
+? 1 次或多次(懒惰)

贪婪与懒惰在模式可能以多种方式匹配时很重要。<.*><b>text</b> 上匹配整个字符串。<.*?> 只匹配 <b>

锚点和边界

模式 匹配
^ 字符串开头(多行模式下为行开头)
$ 字符串结尾(多行模式下为行结尾)
\b 单词边界
\B 非单词边界
\A 字符串开头(Python,忽略多行模式)
\Z 字符串结尾(Python,忽略多行模式)

分组与选择

模式 含义
(abc) 捕获组
(?:abc) 非捕获组
(?<name>abc) 命名捕获组
`a b`
(?=abc) 正向先行断言:后面跟着 abc
(?!abc) 负向先行断言:后面不跟着 abc
(?<=abc) 正向后行断言:前面是 abc
(?<!abc) 负向后行断言:前面不是 abc

真实世界模式

电子邮件地址

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

这匹配绝大多数有效的电子邮件格式。完全符合 RFC 5322 需要更复杂的正则表达式——但这个 95% 的解决方案处理了所有常见情况。

匹配:user@example.comfirst.last+tag@sub.domain.co.uk 拒绝:user@@example.comuser @example.com

URL

https?://[^\s/$.?#].[^\s]*

匹配 http 和 https URL。对于生产环境验证,请使用 URL 构造函数而不是正则表达式——它能正确处理所有边界情况。

IPv4 地址

^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)){3}$

验证每个八位组为 0–255。匹配:192.168.1.10.0.0.0255.255.255.255。拒绝:256.0.0.1192.168.1

正则表达式速查表:每个你真正会用到的模式 插图

电话号码(美国)

^(\+1[\s.-]?)?\(?[2-9]\d{2}\)?[\s.-]?[2-9]\d{2}[\s.-]?\d{4}$

匹配:555-867-5309(555) 867-5309+1 555 867 5309

日期(YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

验证格式和范围(月份 01–12,日期 01–31)。不验证日/月组合——请使用日期库。

时间(HH:MM:SS)

^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$

24 小时制。小时 00–23,分钟和秒 00–59。

强密码

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$

要求至少 8 个字符,一个大写字母,一个小写字母,一个数字,一个特殊字符。使用先行断言独立检查每个要求。

十六进制颜色代码

^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

匹配 #ff6600 和简写 #f60。不区分大小写。

Slug(URL 友好字符串)

^[a-z0-9]+(?:-[a-z0-9]+)*$

匹配:my-blog-postproduct-123。拒绝:-starts-with-dashhas spacesUPPERCASE

信用卡号

^(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12})$

匹配 Visa、MasterCard、Amex、Discover。匹配前务必去除空格和破折号。

JWT 令牌

^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$

三个由点分隔的 Base64url 编码段。

正则表达式速查表:每个你真正会用到的模式 插图

HTML 标签

<([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>(.*?)<\/\1>

匹配标签及其内容。注意:用正则表达式解析 HTML 对于嵌套元素很脆弱——对于复杂情况请使用合适的 HTML 解析器。

Markdown 标题

^(#{1,6})\s+(.+)$

捕获标题级别和文本。组 1:#######。组 2:标题文本。

代码示例

JavaScript

// 测试字符串是否匹配
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test('user@example.com'); // true

// 提取匹配项
const text = 'Call 555-867-5309 or 555-123-4567';
const phoneRegex = /\d{3}-\d{3}-\d{4}/g;
text.match(phoneRegex); // ['555-867-5309', '555-123-4567']

// 替换匹配项
'hello_world_test'.replace(/_/g, '-'); // 'hello-world-test'

// 命名捕获组
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const { year, month, day } = '2026-05-15'.match(dateRegex).groups;

Python

import re

# 测试匹配
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
#39; bool(re.match(pattern, 'user@example.com')) # True # 查找所有匹配 text = 'Dates: 2026-01-15 and 2026-03-20' dates = re.findall(r'\d{4}-\d{2}-\d{2}', text) # ['2026-01-15', '2026-03-20'] # 命名组 m = re.search(r'(?P<year>\d{4})-(?P<month>\d{2})', '2026-05') m.group('year') # '2026' # 用函数替换 result = re.sub(r'\b(\w)', lambda m: m.group().upper(), 'hello world') # 'Hello World'

标志参考

标志 JavaScript Python 效果
不区分大小写 /regex/i re.IGNORECASE A 匹配 a
多行 /regex/m re.MULTILINE ^$ 匹配行边界
点号匹配所有 /regex/s re.DOTALL . 匹配换行符
全局 /regex/g (使用 findall 查找所有匹配,而不仅仅是第一个
详细 N/A re.VERBOSE 允许模式中的空白和注释

性能提示

编译你重复使用的模式——在 Python 中,re.compile(pattern) 创建一个可重用的正则表达式对象。在 JavaScript 中,正则表达式字面量 /pattern/ 在每次加载时编译一次。

避免灾难性回溯——像 (a+)+ 这样的模式在长字符串上可能需要指数级时间。这是 ReDoS(正则表达式拒绝服务攻击)的根源。保持量词简单,避免在同一字符类上嵌套重复。

当你不需要匹配时使用非捕获组——(?:abc)(abc) 更快,因为引擎不存储匹配。

尽可能使用锚点——在适当的地方添加 ^$ 可以防止引擎在匹配失败时搜索整个输入。

常见问题

Python 中 matchsearch 有什么区别? re.match 只匹配字符串的开头。re.search 扫描整个字符串寻找任何匹配。对于大多数用例,re.search 是你想要的。

为什么我的正则表达式在一种语言中有效,在另一种语言中却无效? 不同的正则表达式引擎支持不同的特性。先行/后行断言、命名组和 Unicode 属性因引擎而异。JavaScript 在较旧环境中缺少后行断言;Python 的 re 模块完全支持后行断言。

如何匹配字面点号、星号或其他特殊字符? 用反斜杠转义:\. 匹配字面点号;\* 匹配字面星号。

→ 使用 Regex Tester 交互式编写、测试和调试正则表达式模式——具有实时匹配高亮和标志切换功能。