正则表达式是每次搜索、验证或转换文本时都会用到的技能。本速查表涵盖最常用的模式和示例,你可以立即测试。
打开在线正则测试器 →
字符类
| 模式 | 匹配内容 |
|---|
. | 除换行符外的任意字符 |
\d | 数字 [0-9] |
\D | 非数字 |
\w | 单词字符 [a-zA-Z0-9_] |
\W | 非单词字符 |
\s | 空白符(空格、Tab、换行) |
\S | 非空白符 |
[abc] | a、b 或 c 之一 |
[^abc] | 不是 a、b 或 c |
[a-z] | a 到 z 的小写字母 |
[A-Z] | A 到 Z 的大写字母 |
[0-9] | 0 到 9 的数字 |
锚点
| 模式 | 匹配内容 |
|---|
^ | 字符串(或多行模式中行)的开头 |
$ | 字符串(或多行模式中行)的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
/^\d{5}$/ → 精确匹配5位邮政编码
/\bword\b/ → 匹配"word"但不匹配"password"
量词
| 模式 | 含义 |
|---|
* | 0 次或多次 |
+ | 1 次或多次 |
? | 0 次或 1 次(可选) |
{n} | 恰好 n 次 |
{n,} | n 次或更多 |
{n,m} | n 到 m 次之间 |
贪婪 vs 懒惰: 默认情况下量词是贪婪的(尽可能多匹配)。加 ? 使其懒惰:
<.+> → 贪婪:匹配整个 <b>bold</b>
<.+?> → 懒惰:先匹配 <b>,再匹配 </b>
分组与选择
| 模式 | 含义 |
|---|
(abc) | 捕获组 |
(?:abc) | 非捕获组 |
a|b | 选择:a 或 b |
\1 | 反向引用第 1 组 |
// 从日期字符串中提取年、月、日
const match = '2026-04-03'.match(/(\d{4})-(\d{2})-(\d{2})/);
// match[1] = '2026', match[2] = '04', match[3] = '03'
断言(Lookahead/Lookbehind)
| 模式 | 含义 |
|---|
(?=abc) | 正向预查——后面跟着 abc |
(?!abc) | 负向预查——后面不跟 abc |
(?<=abc) | 正向回顾——前面是 abc |
(?<!abc) | 负向回顾——前面不是 abc |
/\d+(?= 元)/ → 只匹配后面跟" 元"的数字
/(?<=¥)\d+/ → 只匹配前面有"¥"的数字
回顾断言在 JavaScript 中需要 ES2018+。
修饰符
| 修饰符 | 效果 |
|---|
i | 不区分大小写 |
g | 全局——查找所有匹配 |
m | 多行——^ 和 $ 匹配行边界 |
s | 点号模式——. 也匹配换行符 |
u | Unicode 模式 |
/hello/i.test('Hello World') // true
'abc abc'.match(/abc/g) // ['abc', 'abc']
常用模式
电子邮件(基础版)
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
URL
/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)/
IPv4 地址
/^(\d{1,3}\.){3}\d{1,3}$/
HEX 颜色
/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/
Slug(URL 友好字符串)
/^[a-z0-9]+(?:-[a-z0-9]+)*$/
语义化版本号
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([\da-zA-Z-]+(?:\.[\da-zA-Z-]+)*))?(?:\+([\da-zA-Z-]+(?:\.[\da-zA-Z-]+)*))?$/
在代码中使用正则
JavaScript
// 测试是否匹配
/^\d+$/.test('123') // true
/^\d+$/.test('12a') // false
// 找到第一个匹配
'hello world'.match(/\w+/) // ['hello']
// 找到所有匹配
'hello world'.match(/\w+/g) // ['hello', 'world']
// 替换
'foo bar'.replace(/\b\w/g, c => c.toUpperCase()) // 'Foo Bar'
// 分割
'one, two,three'.split(/,\s*/) // ['one', 'two', 'three']
Python
import re
# 测试
bool(re.match(r'^\d+$', '123')) # True
# 找第一个
re.search(r'\d+', 'abc123def').group() # '123'
# 找所有
re.findall(r'\d+', 'a1 b22 c333') # ['1', '22', '333']
# 替换
re.sub(r'\s+', '-', 'hello world') # 'hello-world'
在线实时测试
写好模式后,上线前先测试——边界情况很容易遗漏。
ZeroTool 正则测试器 →
- 粘贴模式和测试字符串
- 实时高亮所有匹配
- 支持修饰符:
g、i、m、s
- 显示捕获组结果
调试技巧
- 从简单开始 — 逐段构建模式
- Python 中用原始字符串 —
r'\d+' 避免双重转义
- 转义特殊字符 —
.、*、+、?、(、)、[、]、{、}、^、$、|、\ 字面量使用时需要转义
- 明确锚定 —
/\d+/ 在任意位置匹配数字;/^\d+$/ 要求整个字符串都是数字
- 测试边界情况 — 空字符串、全匹配、无匹配、重叠模式
正则表达式很强大,但也容易变得难以维护。如果一个模式超过约 60 个字符,考虑拆分为命名子模式或使用解析器库。