正则表达式测试器
还没有匹配结果
输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。
统计
命名分组汇总
当前没有命名分组。
免费在线正则表达式测试器(Regex Tester),支持JS实时匹配测试、捕获组/命名分组查看、替换预览、正则语法解释,内置Web Worker防ReDoS超时保护,附常用正则模板库,适合开发者快速调试和验证正则。
还没有匹配结果
输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。
统计
命名分组汇总
当前没有命名分组。
免费在线正则表达式测试器(Regex Tester),支持JS实时匹配测试、捕获组/命名分组查看、替换预览、正则语法解释,内置Web Worker防ReDoS超时保护,附常用正则模板库,适合开发者快速调试和验证正则。
ReDoS(Regular Expression Denial of Service,正则表达式拒绝服务攻击)是指某些恶意构造的正则表达式(如 `(a+)+$` 匹配长字符串)会触发灾难性回溯(catastrophic backtracking),导致CPU占用100%、浏览器卡死或服务器崩溃。本工具使用 Web Worker 沙箱执行正则匹配,设置 500ms 超时自动中断,即使输入会触发回溯的恶意正则也不会卡死你的浏览器,这是本工具的核心安全特性。
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、$2...表示第N个捕获组;$& 表示整个匹配的文本;$` 表示匹配文本之前的部分;$' 表示匹配文本之后的部分;$$ 表示字面量 $;$<name> 表示命名分组。例如将 `(\d{4})-(\d{2})-(\d{2})` 替换为 `$2/$3/$1` 可将 2026-03-12 转为 03/12/2026。本工具的替换区提供了这些特殊符号的快捷插入按钮。
正则表达式(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等性能陷阱。
| 元字符 | 含义 | 示例说明 |
|---|---|---|
. | 任意单个字符(不含换行,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 |
// 验证邮箱格式
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/2026import 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****5678import 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*
}
}