正则表达式是每次搜索、验证或转换文本时都会用到的技能。本速查表涵盖最常用的模式和示例,你可以立即测试。

打开在线正则测试器 →

字符类

模式匹配内容
.除换行符外的任意字符
\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点号模式——. 也匹配换行符
uUnicode 模式
/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 正则测试器 →

  • 粘贴模式和测试字符串
  • 实时高亮所有匹配
  • 支持修饰符:gims
  • 显示捕获组结果

调试技巧

  1. 从简单开始 — 逐段构建模式
  2. Python 中用原始字符串r'\d+' 避免双重转义
  3. 转义特殊字符.*+?()[]{}^$|\ 字面量使用时需要转义
  4. 明确锚定/\d+/ 在任意位置匹配数字;/^\d+$/ 要求整个字符串都是数字
  5. 测试边界情况 — 空字符串、全匹配、无匹配、重叠模式

正则表达式很强大,但也容易变得难以维护。如果一个模式超过约 60 个字符,考虑拆分为命名子模式或使用解析器库。