logo
GeekFormat

正则表达式测试器

Regex Tester
//
无匹配
Worker · 500ms 超时中断
分类模板库
点选即可填充 pattern / flags / demo
测试文本37
匹配详情
0

还没有匹配结果

输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。

匹配高亮预览· Hover / 点击右侧条目联动
Ada Lovelace Alan Turing Grace Hopper

统计

匹配数量
0
执行耗时
0ms
捕获组
0
命名分组
0

命名分组汇总

当前没有命名分组。

免费在线正则表达式测试器(Regex Tester),支持JS实时匹配测试、捕获组/命名分组查看、替换预览、正则语法解释,内置Web Worker防ReDoS超时保护,附常用正则模板库,适合开发者快速调试和验证正则。

相关推荐

适用场景

  • 开发表单验证规则时在线测试邮箱、手机号、身份证号、URL等正则是否正确
  • 日志分析时用正则提取ERROR/INFO级别日志中的时间戳、错误信息、IP地址
  • 数据清洗/ETL时预览正则替换效果,如日期格式转换、敏感信息脱敏(手机号中间打星号)
  • 编写爬虫时验证内容提取正则是否准确匹配目标HTML片段或JSON字段
  • 学习正则表达式时通过「解释」面板理解每个元字符和量词的含义,配合模板快速上手
  • Code Review时把有疑问的正则通过分享链接发给同事,一起调试优化

功能特点

  • 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条匹配上限:自动截断避免超长文本导致页面卡顿,错误正则友好提示语法错误

使用方法

  1. 在顶部 / / 之间的输入框输入正则表达式(无需自己加斜杠),右侧输入标志位(如 g、gi、gim)或点击下方按钮切换
  2. 在「测试文本」区域粘贴或输入要匹配的文本内容,匹配结果会实时彩色高亮显示
  3. 点击右侧「匹配详情」面板查看每个匹配项的位置、内容、捕获组和命名分组
  4. 切换到「替换区」标签,输入替换字符串(支持$1/$&/$<name>等引用),实时预览替换结果
  5. 切换到「表达式解释」标签,查看自动生成的正则语法逐元素解释
  6. 需要常用模板时,点击左侧「分类模板库」选择对应模板一键填充;调试完成后点「分享」生成链接

常见问题

什么是 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,简称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等性能陷阱。

术语表

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?)\bg
日期 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

Code Examples

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/2026

Python 中使用 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****5678

Java 中使用 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*
    }
}

Authoritative References