在线正则表达式测试工具让你输入正则表达式、粘贴示例文本,并实时看到匹配项高亮——无需 IDE,无需终端,无需一次次提交代码反复试错。调试一个”差点儿就对了”的正则是开发中最让人抓狂的体验之一;交互式测试工具把这个过程变成清晰可见的操作。

立即测试正则表达式 →

为什么用在线正则测试工具?

正则表达式以难以凭记忆阅读和调试著称。在线工具提供:

  • 即时反馈 — 输入时实时看到哪些文本被匹配
  • 标志位控制 — 一键切换 gims 标志,无需改代码
  • 捕获组查看 — 精确显示每个 () 分组捕获了什么内容
  • 安全迭代 — 在不影响生产代码的情况下反复实验

正则标志位

标志位改变模式的匹配行为,理解它们能避免最常见的正则 bug:

标志含义
g全局 — 查找所有匹配,而非只找第一个
i忽略大小写 — [A-Z] 同时匹配 [a-z]
m多行 — ^$ 匹配每行的开头和结尾
s点号全匹配 — . 也匹配换行符
uUnicode — 启用完整 Unicode 匹配
d索引 — 返回捕获组的起止位置索引

最常见的错误:期望找到多个匹配时忘记加 g 标志。

正则核心语法

字符类

\d        — 任意数字 [0-9]
\D        — 任意非数字
\w        — 单词字符 [a-zA-Z0-9_]
\W        — 非单词字符
\s        — 空白字符(空格、制表符、换行)
\S        — 非空白字符
.         — 任意字符(除换行,加 s 标志后包含换行)
[abc]     — 字符类:a、b 或 c
[^abc]    — 否定类:除 a、b、c 以外的任意字符
[a-z]     — 范围:小写 a 到 z
[a-zA-Z] — 范围:任意字母

量词

*         — 0 个或多个(贪婪)
+         — 1 个或多个(贪婪)
?         — 0 个或 1 个(可选)
{3}       — 恰好 3 个
{3,}      — 3 个或更多
{3,6}     — 3 到 6 个(含边界)
*?        — 0 个或多个(懒惰/非贪婪)
+?        — 1 个或多个(懒惰/非贪婪)

贪婪 vs 懒惰<.+> 作用于 <a>foo</a> 会匹配整个字符串。<.+?> 分别匹配 <a></a>

锚点

^         — 字符串起始(加 m 标志后为行首)
$         — 字符串结尾(加 m 标志后为行尾)
\b        — 单词边界
\B        — 非单词边界

分组与捕获

(abc)         — 捕获组:将 "abc" 捕获为第 1 组
(?:abc)       — 非捕获组:分组但不捕获
(?<name>abc)  — 命名捕获组:通过 groups.name 访问
(a|b)         — 交替:匹配 "a" 或 "b"

前瞻与后顾

(?=abc)   — 正向前瞻:其后紧跟 "abc"
(?!abc)   — 负向前瞻:其后不跟 "abc"
(?<=abc)  — 正向后顾:其前紧跟 "abc"
(?<!abc)  — 负向后顾:其前不跟 "abc"

环视匹配的是位置,不消耗字符,不会包含在匹配结果中。

常用正则模式

邮箱地址验证

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

覆盖常见场景。完全符合 RFC 5321 的邮箱正则极其复杂,生产环境建议用库或简单格式检查加确认邮件的组合方案。

URL 匹配

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

匹配 http://https:// URL。需要更严格验证时:

^(https?:\/\/)([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}(\/[^\s]*)?$

IPv4 地址

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

验证每个字节在 0–255 范围内。

语义化版本号(semver)

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*))*))?(?:\+([0-9a-zA-Z\-]+(?:\.[0-9a-zA-Z\-]+)*))?$

完整支持预发布标签和构建元数据。

ISO 8601 日期

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

匹配 YYYY-MM-DD 格式,带基本范围校验。

从文本中提取数字

-?\d+(?:\.\d+)?

匹配整数和小数(可带负号),适合解析日志输出或配置文件。

十六进制颜色值

#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\b

同时匹配 3 位(#fff)和 6 位(#ffffff)十六进制颜色。

日志行解析

^(?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\s+(?<level>ERROR|WARN|INFO|DEBUG)\s+(?<message>.+)$

使用命名捕获组,从非结构化日志行中提取结构化数据。

各语言中使用正则

JavaScript

// 基本匹配
const email = 'user@example.com';
const pattern = /^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/;
console.log(pattern.test(email)); // true

// 提取所有匹配(需要 g 标志)
const text = '价格:¥12.50、¥199、¥0.99';
const prices = text.match(/¥\d+(?:\.\d{2})?/g);
// ['¥12.50', '¥199', '¥0.99']

// 命名捕获组
const log = '2026-04-07T14:23:01 ERROR 连接被拒绝';
const logPattern = /^(?<ts>\S+)\s+(?<level>\w+)\s+(?<msg>.+)$/;
const { ts, level, msg } = log.match(logPattern).groups;

// 替换(使用反向引用)
const camelToSnake = str => str.replace(/([A-Z])/g, '_$1').toLowerCase();
camelToSnake('camelCaseString'); // 'camel_case_string'

Python

import re

# 搜索并提取
text = "订单 #12345 下单时间 2026-04-07"
m = re.search(r'#(\d+)', text)
if m:
    print(m.group(1))  # '12345'

# 查找所有匹配
emails = re.findall(r'[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}', text)

# 命名分组
pattern = re.compile(
    r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
)
m = pattern.search(text)
print(m.group('year'), m.group('month'), m.group('day'))

# 替换
result = re.sub(r'\b(\w+)\b', lambda m: m.group().upper(), 'hello world')
# 'HELLO WORLD'

Go

import "regexp"

// 编译一次,复用
emailRe := regexp.MustCompile(`^[\w.%+\-]+@[\w\-]+\.[a-zA-Z]{2,}$`)
fmt.Println(emailRe.MatchString("user@example.com")) // true

// 查找所有匹配
re := regexp.MustCompile(`¥\d+(?:\.\d{2})?`)
matches := re.FindAllString("价格:¥12.50 和 ¥199", -1)
// ["¥12.50", "¥199"]

// 命名子匹配
re = regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})`)
match := re.FindStringSubmatch("2026-04")
names := re.SubexpNames()
// 遍历 names 将名称映射到匹配值

常见正则错误

忘记转义特殊字符.*+?()[]{}^$|\ 都是元字符。要匹配字面量点号,需要写 \.

贪婪量词用错场景<.+> 会从第一个 < 匹配到最后一个 >。改用 <.+?> 才能逐个匹配标签。

JavaScript 中忘加 g 标志string.match(/pattern/) 不带 g 只返回第一个匹配。需要所有匹配时加 g

多行文本中不加 m 标志就用 ^$ — 不加 m 时,^ 只匹配整个字符串的起始,不匹配每行行首。

灾难性回溯(a+)+ 这类模式在长的不匹配字符串上会导致指数级时间复杂度。避免在重叠字符类上嵌套量词。

过度工程化邮箱验证 — 完全符合 RFC 规范的邮箱正则超过 6000 个字符,仍然无法阻止所有无效邮箱。格式检查加确认邮件才是正确方案。

立即在线测试你的正则

ZeroTool 的正则测试工具提供分屏编辑器——左侧写模式,右侧粘贴示例文本。匹配项实时高亮,捕获组在下方展示,标志位一键切换。

无需安装。无速率限制。全程运行在你的浏览器中。

打开正则测试工具 →