正则表达式测试器
还没有匹配结果
输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。
统计
命名分组汇总
当前没有命名分组。
免费在线正则表达式测试器(Regex Tester),支持JS实时匹配测试、捕获组/命名分组查看、替换预览、正则语法解释,内置Web Worker防ReDoS超时保护,附常用正则模板库,适合开发者快速调试和验证正则。
相关推荐
什么是正则表达式(Regex/RegExp)?
正则表达式(Regular Expression,简称Regex/RegExp)是一种用单个字符串描述、匹配一系列符合某个句法规则的字符串的文本模式语言。它的历史可以追溯到1950年代神经学家Warren McCulloch和数学家Walter Pitts提出的神经元数学模型,后来数学家Stephen Kleene在1956年在此基础上提出了「正则集合」的代数描述。Unix之父Ken Thompson在1960年代末将正则表达式首次实现在QED编辑器中,此后正则表达式成为Unix工具链(grep、sed、awk、vi)的核心功能。
现代编程语言中,正则表达式几乎是标配能力——JavaScript的RegExp、Python的re模块、Java的java.util.regex、.NET的Regex类、Go的regexp包都提供了正则支持。正则表达式广泛应用于表单验证(邮箱/手机号/身份证)、文本搜索与替换(编辑器查找替换)、日志分析(提取ERROR日志)、网络爬虫(HTML内容提取)、数据清洗(ETL)、路由匹配、输入过滤和安全防护(WAF规则)等场景。
正则表达式的核心概念包括:字符类(\d数字、\w单词字符、\s空白)、量词(*零或多、+一或多、?零或一、{n,m}指定次数)、锚点(^开头、$结尾、\b单词边界)、分组((...)捕获组、(?:...)非捕获组、(?<name>...)命名分组)、分支(|)、字符集([a-z])、环视((?=...)正向预查、(?!)负向预查)等。掌握正则可以极大提升文本处理效率,但也需要注意防范ReDoS等性能陷阱。
适用场景
- 开发表单验证规则时在线测试邮箱、手机号、身份证号、URL等正则是否正确
- 日志分析时用正则提取ERROR/INFO级别日志中的时间戳、错误信息、IP地址
- 数据清洗/ETL时预览正则替换效果,如日期格式转换、敏感信息脱敏(手机号中间打星号)
- 编写爬虫时验证内容提取正则是否准确匹配目标HTML片段或JSON字段
- 学习正则表达式时通过「解释」面板理解每个元字符和量词的含义,配合模板快速上手
- Code Review时把有疑问的正则通过分享链接发给同事,一起调试优化
使用方法
- 在顶部 / / 之间的输入框输入正则表达式(无需自己加斜杠),右侧输入标志位(如 g、gi、gim)或点击下方按钮切换
- 在「测试文本」区域粘贴或输入要匹配的文本内容,匹配结果会实时彩色高亮显示
- 点击右侧「匹配详情」面板查看每个匹配项的位置、内容、捕获组和命名分组
- 切换到「替换区」标签,输入替换字符串(支持$1/$&/$<name>等引用),实时预览替换结果
- 切换到「表达式解释」标签,查看自动生成的正则语法逐元素解释
- 需要常用模板时,点击左侧「分类模板库」选择对应模板一键填充;调试完成后点「分享」生成链接
功能特点
- Web Worker沙箱执行:正则在独立Worker线程中运行,500ms超时自动中断,彻底防止ReDoS卡死浏览器
- 实时匹配+彩色高亮:输入即刻显示匹配结果,不同匹配项用5种颜色高亮区分,hover联动详情面板
- 捕获组+命名分组:每个匹配项自动展开显示所有捕获组($1/$2)和命名分组($<name>),并汇总统计
- 替换预览:输入替换字符串实时预览替换结果,支持$1/$&/$`/$'/$<name>语法快捷按钮
- 正则语法解释:自动解析正则表达式,逐元素解释元字符、量词、分组、锚点等语法含义
- 12个常用模板:内置邮箱/URL/手机号/中文/IPv4/UUID/日期/日志/HTML标签等12个高频正则模板,一键填充
- 6个标志位切换:g/i/m/s/u/y标志位可视化按钮切换,无需记忆语法
- 分享链接:一键生成包含pattern/flags/text的URL,复制给同事直接复现测试现场
- 执行统计:实时显示匹配数量、执行耗时(ms)、捕获组总数、命名分组数量
- 1500条匹配上限:自动截断避免超长文本导致页面卡顿,错误正则友好提示语法错误
代码示例
JavaScript 中正则匹配与替换
// 验证邮箱格式
const emailRe = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailRe.test('user@example.com')); // true
// 提取命名分组(日期解析)
const dateRe = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g;
const text = '会议时间:2026-03-12,截止:2026-04-01';
const matches = [...text.matchAll(dateRe)];
for (const m of matches) {
console.log(m.groups.year, m.groups.month, m.groups.day);
}
// 替换:日期格式转换 YYYY-MM-DD → MM/DD/YYYY
const reformatted = text.replace(dateRe, '$<month>/$<day>/$<year>');
console.log(reformatted);
// 会议时间:03/12/2026,截止:04/01/2026Python 中使用 re 模块
import re
# 查找所有匹配项
text = '联系:alice@example.com,bob@test.org'
emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)
print(emails) # ['alice@example.com', 'bob@test.org']
# 命名分组提取(Python 用 ?P<name> 语法)
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, '发布于 2026-03-12')
if m:
print(m.group('year'), m.group('month'), m.group('day'))
# 替换:手机号中间4位脱敏
phone_re = r'(1[3-9]\d)\d{4}(\d{4})'
result = re.sub(phone_re, r'\1****\2', '手机号:13812345678')
print(result) # 手机号:138****5678Java 中使用 java.util.regex
import java.util.regex.*;
class RegexDemo {
public static void main(String[] args) {
String text = "Error [2026-03-12 18:05:09] Connection failed";
// 编译正则(生产环境应缓存 Pattern 实例)
Pattern p = Pattern.compile(
"(?<level>INFO|WARN|ERROR)\\s+\\[(?<time>[^\\]]+)\\]\\s+(?<message>.+)"
);
Matcher m = p.matcher(text);
if (m.find()) {
System.out.println("级别: " + m.group("level"));
System.out.println("时间: " + m.group("time"));
System.out.println("消息: " + m.group("message"));
}
// 替换所有数字
String cleaned = "abc123def456".replaceAll("\\d+", "*");
System.out.println(cleaned); // abc*def*
}
}常见问题
什么是 ReDoS?为什么正则测试需要防 ReDoS?
ReDoS(Regular Expression Denial of Service,正则表达式拒绝服务攻击)是指某些恶意构造的正则表达式(如 `(a+)+$` 匹配长字符串)会触发灾难性回溯(catastrophic backtracking),导致CPU占用100%、浏览器卡死或服务器崩溃。本工具使用 Web Worker 沙箱执行正则匹配,设置 500ms 超时自动中断,即使输入会触发回溯的恶意正则也不会卡死你的浏览器,这是本工具的核心安全特性。
正则表达式中 g、i、m、s、u、y 六个标志位分别是什么意思?
g(global)全局匹配,查找所有匹配项而非第一个;i(ignoreCase)忽略大小写;m(multiline)多行模式,使 ^ 和 $ 匹配每行开头/结尾;s(dotAll)让点号 . 匹配包括换行符在内的所有字符;u(unicode)Unicode模式,正确处理 emoji 和多字节字符;y(sticky)粘性匹配,从 lastIndex 位置开始精确匹配。本工具提供了6个标志位的可视化切换按钮,点击即可实时开关。
什么是捕获组和命名分组?怎么用?
捕获组用圆括号 `(pattern)` 包裹,匹配后可通过 $1、$2 等引用提取子串。命名分组用 `(?<name>pattern)` 语法,匹配后可通过 `$<name>` 引用,代码可读性更高。例如用 `(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})` 匹配日期后,可以在替换字符串中用 `$<year>年$<month>月$<day>日` 重新格式化。本工具会自动列出每个匹配的捕获组和命名分组结果。
支持哪些编程语言的正则语法?
本工具基于 JavaScript 原生 RegExp 引擎,与 JS/TypeScript、Python re 模块、Java java.util.regex、PHP preg_*、Go regexp 等主流引擎语法大体兼容(都基于 PCRE/Perl 流派),主要差异在一些高级特性(如 Python 的 `(?P<name>)` 命名分组写法、.NET 的可变长度lookbehind)。日常开发中 99% 的正则(邮箱、手机号、URL、日期等验证/提取)在各引擎间通用,可以直接在本工具测试后复制到代码中使用。
如何把测试好的正则分享给同事?
点击顶部工具栏的「分享」按钮,工具会自动将当前正则表达式、标志位、测试文本编码到URL参数中,并复制链接到剪贴板。同事打开链接即可看到完全一致的测试状态(pattern+flags+testText),非常适合团队协作和远程调试。
替换字符串中 $1、$&、$`、$' 这些特殊符号是什么意思?
在替换字符串中:$1、$2...表示第N个捕获组;$& 表示整个匹配的文本;$` 表示匹配文本之前的部分;$' 表示匹配文本之后的部分;$$ 表示字面量 $;$<name> 表示命名分组。例如将 `(\d{4})-(\d{2})-(\d{2})` 替换为 `$2/$3/$1` 可将 2026-03-12 转为 03/12/2026。本工具的替换区提供了这些特殊符号的快捷插入按钮。
术语表
- Regex / RegExp
- Regular Expression(正则表达式)的缩写,一种描述文本匹配模式的字符串语法,用于搜索、替换、验证文本。
- 捕获组 (Capture Group)
- 用圆括号 (pattern) 包裹的子表达式,匹配结果可通过 $1、$2 按位置引用。
- 命名分组 (Named Group)
- 用 (?<name>pattern) 语法定义的捕获组,可通过 $<name> 按名称引用,比数字引用可读性更高。
- ReDoS
- Regular Expression Denial of Service(正则拒绝服务),由灾难性回溯导致正则执行时间指数级增长,卡死浏览器或服务器。
- 回溯 (Backtracking)
- NFA正则引擎在尝试匹配失败时回退到之前位置尝试其他可能性的机制,复杂正则可能导致指数级回溯。
- 标志位 (Flags)
- 修改正则匹配行为的参数,常见有 g(全局)、i(忽略大小写)、m(多行)、s(dotAll)、u(Unicode)、y(粘性)。
- 环视 (Lookaround)
- 零宽断言,包括正向预查 (?=...)、负向预查 (?!...)、正向后顾 (?<=...)、负向后顾 (?<!...),只判断位置不消耗字符。
- PCRE
- Perl Compatible Regular Expressions(Perl兼容正则表达式),一种广泛使用的正则语法标准,被PHP、Java、Python等多数语言采用。
- Web Worker
- 浏览器提供的独立于主线程的后台线程API,本工具用它在Worker中执行正则,即使发生ReDoS也不阻塞UI。
- 量词 (Quantifier)
- 指定前一元素重复次数的语法:*(0或多)、+(1或多)、?(0或1)、{n}(恰好n次)、{n,m}(n到m次)。
正则表达式常用元字符速查表
| 元字符 | 含义 | 示例说明 |
|---|---|---|
. | 任意单个字符(不含换行,s标志下含换行) | a.c 匹配 abc、aXc,不匹配 a\nc |
\d | 数字字符,等价于 [0-9] | \d{3} 匹配 123、456 |
\w | 单词字符,等价于 [A-Za-z0-9_] | \w+ 匹配 hello_123 |
\s | 空白字符(空格/制表符/换行等) | a\sb 匹配 a b(中间空格) |
^ | 字符串开头(m标志下为行首) | ^Hello 匹配行首的Hello |
$ | 字符串结尾(m标志下为行尾) | end$ 匹配行尾的end |
\b | 单词边界 | \bcat\b 匹配独立单词cat,不匹配category |
* | 前一元素重复 0 次或多次(贪婪) | ab*c 匹配 ac、abc、abbc |
+ | 前一元素重复 1 次或多次 | ab+c 匹配 abc、abbc,不匹配ac |
? | 前一元素 0 次或 1 次(或用于非贪婪/环视) | colou?r 匹配 color和colour |
| | 分支/或,匹配左边或右边 | cat|dog 匹配cat或dog |
[...] | 字符集合,匹配其中任一字符 | [aeiou] 匹配任一元音字母 |
常用正则表达式速查模板
| 用途 | 正则表达式 | 推荐标志 |
|---|---|---|
| 邮箱地址 | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} | g |
| 中国大陆手机号 | 1[3-9]\d{9} | g |
| URL链接 | https?:\/\/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b[-a-zA-Z0-9()@:%_+.~#?&/=]* | gi |
| IPv4地址 | \b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b | g |
| 日期 YYYY-MM-DD | \d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01]) | g |
| 身份证号(18位) | [1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx] | g |
| UUID | [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12} | gi |
Authoritative References
- MDNMDN: RegExp 官方文档
- Wikipedia正则表达式 - 维基百科
- OWASPOWASP: ReDoS 攻击防护指南
- 色盲模拟器
- 颜色转换器
- .htaccess 转 Nginx 转换器
- SQL 转换器
- Cookie 解析器
- Cron 表达式工作台
- Cron 表达式验证器
- CSS 格式化
- CSS 压缩
- CSV 转 Excel
- CSV Viewer
- CSV Editor
- 货币转换器
- 差异检查器
- Excel to CSV
- 网站图标生成器
- CSS Formatter
- HTML Formatter
- Markdown Formatter
- XML 格式
- 十六进制转换器
- HTML 格式
- HTML 压缩
- HTML 转 Markdown
- Markdown 转 HTML
- JavaScript 格式化
- JS 压缩
- JSX 格式化工具
- JSX 压缩
- 关键词聚类
- Lorem Ipsum 生成器
- Markdown 表格生成器
- Meta Tag 生成器
- 密码生成器
- 密码强度检测工具
- 二维码/条形码生成器
- 正则表达式测试器
- Slug 生成器
- SQL 生成器
- SQL 格式化工具
- 字数统计
- 时间工具
- TS 格式
- TS 压缩
- TSX 格式化
- TSX 压缩
- Unix 时间戳转换
- UUID 生成器
- YAML 格式化
- 大小写命名风格转换器