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

字符类
| 模式 | 匹配 |
|---|---|
. |
除换行符外的任何字符 |
\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.com、first.last+tag@sub.domain.co.uk
拒绝:user@、@example.com、user @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.1、0.0.0.0、255.255.255.255。拒绝:256.0.0.1、192.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-post、product-123。拒绝:-starts-with-dash、has spaces、UPPERCASE。
信用卡号
^(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 中 match 和 search 有什么区别?
re.match 只匹配字符串的开头。re.search 扫描整个字符串寻找任何匹配。对于大多数用例,re.search 是你想要的。
为什么我的正则表达式在一种语言中有效,在另一种语言中却无效?
不同的正则表达式引擎支持不同的特性。先行/后行断言、命名组和 Unicode 属性因引擎而异。JavaScript 在较旧环境中缺少后行断言;Python 的 re 模块完全支持后行断言。
如何匹配字面点号、星号或其他特殊字符?
用反斜杠转义:\. 匹配字面点号;\* 匹配字面星号。
→ 使用 Regex Tester 交互式编写、测试和调试正则表达式模式——具有实时匹配高亮和标志切换功能。